]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/iio/pressure/mpl115.c
iio: pressure: mpl115: support MPL115A1
[mirror_ubuntu-artful-kernel.git] / drivers / iio / pressure / mpl115.c
index 3e1e33535fe124eec00d497f8a7b9681bf492de9..138344ca3ffd352f8c438dbc620b1b9b09c6b0f0 100644 (file)
@@ -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 */
 #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");