|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
- * mpl115.c - Support for Freescale MPL115A2 pressure/temperature sensor
|
|
|
+ * mpl115.c - Support for Freescale MPL115A pressure/temperature sensor
|
|
|
*
|
|
|
* Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net>
|
|
|
*
|
|
@@ -7,17 +7,16 @@
|
|
|
* the GNU General Public License. See the file COPYING in the main
|
|
|
* directory of this archive for more details.
|
|
|
*
|
|
|
- * (7-bit I2C slave address 0x60)
|
|
|
- *
|
|
|
* TODO: shutdown pin
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
#include <linux/module.h>
|
|
|
-#include <linux/i2c.h>
|
|
|
#include <linux/iio/iio.h>
|
|
|
#include <linux/delay.h>
|
|
|
|
|
|
+#include "mpl115.h"
|
|
|
+
|
|
|
#define MPL115_PADC 0x00 /* pressure ADC output value, MSB first, 10 bit */
|
|
|
#define MPL115_TADC 0x02 /* temperature ADC output value, MSB first, 10 bit */
|
|
|
#define MPL115_A0 0x04 /* 12 bit integer, 3 bit fraction */
|
|
@@ -27,16 +26,18 @@
|
|
|
#define MPL115_CONVERT 0x12 /* convert temperature and pressure */
|
|
|
|
|
|
struct mpl115_data {
|
|
|
- struct i2c_client *client;
|
|
|
+ struct device *dev;
|
|
|
struct mutex lock;
|
|
|
s16 a0;
|
|
|
s16 b1, b2;
|
|
|
s16 c12;
|
|
|
+ const struct mpl115_ops *ops;
|
|
|
};
|
|
|
|
|
|
static int mpl115_request(struct mpl115_data *data)
|
|
|
{
|
|
|
- int ret = i2c_smbus_write_byte_data(data->client, MPL115_CONVERT, 0);
|
|
|
+ int ret = data->ops->write(data->dev, MPL115_CONVERT, 0);
|
|
|
+
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
@@ -57,12 +58,12 @@ static int mpl115_comp_pressure(struct mpl115_data *data, int *val, int *val2)
|
|
|
if (ret < 0)
|
|
|
goto done;
|
|
|
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_PADC);
|
|
|
+ ret = data->ops->read(data->dev, MPL115_PADC);
|
|
|
if (ret < 0)
|
|
|
goto done;
|
|
|
padc = ret >> 6;
|
|
|
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_TADC);
|
|
|
+ ret = data->ops->read(data->dev, MPL115_TADC);
|
|
|
if (ret < 0)
|
|
|
goto done;
|
|
|
tadc = ret >> 6;
|
|
@@ -90,7 +91,7 @@ static int mpl115_read_temp(struct mpl115_data *data)
|
|
|
ret = mpl115_request(data);
|
|
|
if (ret < 0)
|
|
|
goto done;
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_TADC);
|
|
|
+ ret = data->ops->read(data->dev, MPL115_TADC);
|
|
|
done:
|
|
|
mutex_unlock(&data->lock);
|
|
|
return ret;
|
|
@@ -145,65 +146,53 @@ static const struct iio_info mpl115_info = {
|
|
|
.driver_module = THIS_MODULE,
|
|
|
};
|
|
|
|
|
|
-static int mpl115_probe(struct i2c_client *client,
|
|
|
- const struct i2c_device_id *id)
|
|
|
+int mpl115_probe(struct device *dev, const char *name,
|
|
|
+ const struct mpl115_ops *ops)
|
|
|
{
|
|
|
struct mpl115_data *data;
|
|
|
struct iio_dev *indio_dev;
|
|
|
int ret;
|
|
|
|
|
|
- if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_WORD_DATA))
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
|
|
|
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
|
|
|
if (!indio_dev)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
data = iio_priv(indio_dev);
|
|
|
- data->client = client;
|
|
|
+ data->dev = dev;
|
|
|
+ data->ops = ops;
|
|
|
mutex_init(&data->lock);
|
|
|
|
|
|
indio_dev->info = &mpl115_info;
|
|
|
- indio_dev->name = id->name;
|
|
|
- indio_dev->dev.parent = &client->dev;
|
|
|
+ indio_dev->name = name;
|
|
|
+ indio_dev->dev.parent = dev;
|
|
|
indio_dev->modes = INDIO_DIRECT_MODE;
|
|
|
indio_dev->channels = mpl115_channels;
|
|
|
indio_dev->num_channels = ARRAY_SIZE(mpl115_channels);
|
|
|
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_A0);
|
|
|
+ ret = data->ops->init(data->dev);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = data->ops->read(data->dev, MPL115_A0);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
data->a0 = ret;
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_B1);
|
|
|
+ ret = data->ops->read(data->dev, MPL115_B1);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
data->b1 = ret;
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_B2);
|
|
|
+ ret = data->ops->read(data->dev, MPL115_B2);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
data->b2 = ret;
|
|
|
- ret = i2c_smbus_read_word_swapped(data->client, MPL115_C12);
|
|
|
+ ret = data->ops->read(data->dev, MPL115_C12);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
data->c12 = ret;
|
|
|
|
|
|
- return devm_iio_device_register(&client->dev, indio_dev);
|
|
|
+ return devm_iio_device_register(dev, indio_dev);
|
|
|
}
|
|
|
-
|
|
|
-static const struct i2c_device_id mpl115_id[] = {
|
|
|
- { "mpl115", 0 },
|
|
|
- { }
|
|
|
-};
|
|
|
-MODULE_DEVICE_TABLE(i2c, mpl115_id);
|
|
|
-
|
|
|
-static struct i2c_driver mpl115_driver = {
|
|
|
- .driver = {
|
|
|
- .name = "mpl115",
|
|
|
- },
|
|
|
- .probe = mpl115_probe,
|
|
|
- .id_table = mpl115_id,
|
|
|
-};
|
|
|
-module_i2c_driver(mpl115_driver);
|
|
|
+EXPORT_SYMBOL_GPL(mpl115_probe);
|
|
|
|
|
|
MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>");
|
|
|
MODULE_DESCRIPTION("Freescale MPL115 pressure/temperature driver");
|