iio: sensors-core: st: Support sensors which don't have a Data Ready pin
authorLee Jones <lee.jones@linaro.org>
Mon, 16 Sep 2013 16:02:00 +0000 (17:02 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sat, 21 Sep 2013 18:24:03 +0000 (19:24 +0100)
Not all ST's sensors support data ready, so let's make the declaration
of one conditional.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/common/st_sensors/st_sensors_core.c
drivers/iio/pressure/st_pressure_core.c

index 793136a..d21b611 100644 (file)
@@ -198,21 +198,17 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
 }
 EXPORT_SYMBOL(st_sensors_set_axis_enable);
 
-int st_sensors_init_sensor(struct iio_dev *indio_dev,
-                                       struct st_sensors_platform_data *pdata)
+static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
+                                      struct st_sensors_platform_data *pdata)
 {
-       int err;
        struct st_sensor_data *sdata = iio_priv(indio_dev);
 
-       mutex_init(&sdata->tb.buf_lock);
-
        switch (pdata->drdy_int_pin) {
        case 1:
                if (sdata->sensor->drdy_irq.mask_int1 == 0) {
                        dev_err(&indio_dev->dev,
                                        "DRDY on INT1 not available.\n");
-                       err = -EINVAL;
-                       goto init_error;
+                       return -EINVAL;
                }
                sdata->drdy_int_pin = 1;
                break;
@@ -220,17 +216,29 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev,
                if (sdata->sensor->drdy_irq.mask_int2 == 0) {
                        dev_err(&indio_dev->dev,
                                        "DRDY on INT2 not available.\n");
-                       err = -EINVAL;
-                       goto init_error;
+                       return -EINVAL;
                }
                sdata->drdy_int_pin = 2;
                break;
        default:
                dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n");
-               err = -EINVAL;
-               goto init_error;
+               return -EINVAL;
        }
 
+       return 0;
+}
+
+int st_sensors_init_sensor(struct iio_dev *indio_dev,
+                                       struct st_sensors_platform_data *pdata)
+{
+       struct st_sensor_data *sdata = iio_priv(indio_dev);
+       int err = 0;
+
+       mutex_init(&sdata->tb.buf_lock);
+
+       if (pdata)
+               err = st_sensors_set_drdy_int_pin(indio_dev, pdata);
+
        err = st_sensors_set_enable(indio_dev, false);
        if (err < 0)
                goto init_error;
@@ -266,6 +274,9 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
        u8 drdy_mask;
        struct st_sensor_data *sdata = iio_priv(indio_dev);
 
+       if (!sdata->sensor->drdy_irq.addr)
+               return 0;
+
        /* Enable/Disable the interrupt generator 1. */
        if (sdata->sensor->drdy_irq.ig1.en_addr > 0) {
                err = st_sensors_write_data_with_mask(indio_dev,
index 93bff9b..3abada2 100644 (file)
@@ -254,7 +254,8 @@ int st_press_common_probe(struct iio_dev *indio_dev,
 
        pdata->odr = pdata->sensor->odr.odr_avl[0].hz;
 
-       if (!plat_data)
+       /* Some devices don't support a data ready pin. */
+       if (!plat_data && pdata->sensor->drdy_irq.addr)
                plat_data =
                        (struct st_sensors_platform_data *)&default_press_pdata;