162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Freescale MPL115A2 pressure/temperature sensor
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * (7-bit I2C slave address 0x60)
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Datasheet: http://www.nxp.com/files/sensors/doc/data_sheet/MPL115A2.pdf
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/module.h>
1362306a36Sopenharmony_ci#include <linux/i2c.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "mpl115.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic int mpl115_i2c_init(struct device *dev)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	return 0;
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic int mpl115_i2c_read(struct device *dev, u8 address)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	return i2c_smbus_read_word_swapped(to_i2c_client(dev), address);
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic int mpl115_i2c_write(struct device *dev, u8 address, u8 value)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	return i2c_smbus_write_byte_data(to_i2c_client(dev), address, value);
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic const struct mpl115_ops mpl115_i2c_ops = {
3362306a36Sopenharmony_ci	.init = mpl115_i2c_init,
3462306a36Sopenharmony_ci	.read = mpl115_i2c_read,
3562306a36Sopenharmony_ci	.write = mpl115_i2c_write,
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic int mpl115_i2c_probe(struct i2c_client *client)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	const struct i2c_device_id *id = i2c_client_get_device_id(client);
4162306a36Sopenharmony_ci	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA))
4262306a36Sopenharmony_ci		return -EOPNOTSUPP;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	return mpl115_probe(&client->dev, id->name, &mpl115_i2c_ops);
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistatic const struct i2c_device_id mpl115_i2c_id[] = {
4862306a36Sopenharmony_ci	{ "mpl115", 0 },
4962306a36Sopenharmony_ci	{ }
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, mpl115_i2c_id);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic struct i2c_driver mpl115_i2c_driver = {
5462306a36Sopenharmony_ci	.driver = {
5562306a36Sopenharmony_ci		.name	= "mpl115",
5662306a36Sopenharmony_ci		.pm = pm_ptr(&mpl115_dev_pm_ops),
5762306a36Sopenharmony_ci	},
5862306a36Sopenharmony_ci	.probe = mpl115_i2c_probe,
5962306a36Sopenharmony_ci	.id_table = mpl115_i2c_id,
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_cimodule_i2c_driver(mpl115_i2c_driver);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciMODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
6462306a36Sopenharmony_ciMODULE_DESCRIPTION("Freescale MPL115A2 pressure/temperature driver");
6562306a36Sopenharmony_ciMODULE_LICENSE("GPL");
6662306a36Sopenharmony_ciMODULE_IMPORT_NS(IIO_MPL115);
67