diff options
| author | Lee Jones <lee.jones@linaro.org> | 2013-09-16 12:02:00 -0400 |
|---|---|---|
| committer | Jonathan Cameron <jic23@kernel.org> | 2013-09-21 14:24:03 -0400 |
| commit | 38d1c6a9116bd9642ebcb027ac66305590aa8488 (patch) | |
| tree | 068330a74e5e4f649a7eced16256ffe6ff2c50ee /drivers/iio/common | |
| parent | 9d6c39867cc6cdfb6198ec83165b72e0f14ef8b6 (diff) | |
iio: sensors-core: st: Support sensors which don't have a Data Ready pin
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>
Diffstat (limited to 'drivers/iio/common')
| -rw-r--r-- | drivers/iio/common/st_sensors/st_sensors_core.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c index 793136aff390..d21b611d875b 100644 --- a/drivers/iio/common/st_sensors/st_sensors_core.c +++ b/drivers/iio/common/st_sensors/st_sensors_core.c | |||
| @@ -198,21 +198,17 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable) | |||
| 198 | } | 198 | } |
| 199 | EXPORT_SYMBOL(st_sensors_set_axis_enable); | 199 | EXPORT_SYMBOL(st_sensors_set_axis_enable); |
| 200 | 200 | ||
| 201 | int st_sensors_init_sensor(struct iio_dev *indio_dev, | 201 | static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, |
| 202 | struct st_sensors_platform_data *pdata) | 202 | struct st_sensors_platform_data *pdata) |
| 203 | { | 203 | { |
| 204 | int err; | ||
| 205 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 204 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
| 206 | 205 | ||
| 207 | mutex_init(&sdata->tb.buf_lock); | ||
| 208 | |||
| 209 | switch (pdata->drdy_int_pin) { | 206 | switch (pdata->drdy_int_pin) { |
| 210 | case 1: | 207 | case 1: |
| 211 | if (sdata->sensor->drdy_irq.mask_int1 == 0) { | 208 | if (sdata->sensor->drdy_irq.mask_int1 == 0) { |
| 212 | dev_err(&indio_dev->dev, | 209 | dev_err(&indio_dev->dev, |
| 213 | "DRDY on INT1 not available.\n"); | 210 | "DRDY on INT1 not available.\n"); |
| 214 | err = -EINVAL; | 211 | return -EINVAL; |
| 215 | goto init_error; | ||
| 216 | } | 212 | } |
| 217 | sdata->drdy_int_pin = 1; | 213 | sdata->drdy_int_pin = 1; |
| 218 | break; | 214 | break; |
| @@ -220,17 +216,29 @@ int st_sensors_init_sensor(struct iio_dev *indio_dev, | |||
| 220 | if (sdata->sensor->drdy_irq.mask_int2 == 0) { | 216 | if (sdata->sensor->drdy_irq.mask_int2 == 0) { |
| 221 | dev_err(&indio_dev->dev, | 217 | dev_err(&indio_dev->dev, |
| 222 | "DRDY on INT2 not available.\n"); | 218 | "DRDY on INT2 not available.\n"); |
| 223 | err = -EINVAL; | 219 | return -EINVAL; |
| 224 | goto init_error; | ||
| 225 | } | 220 | } |
| 226 | sdata->drdy_int_pin = 2; | 221 | sdata->drdy_int_pin = 2; |
| 227 | break; | 222 | break; |
| 228 | default: | 223 | default: |
| 229 | dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n"); | 224 | dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n"); |
| 230 | err = -EINVAL; | 225 | return -EINVAL; |
| 231 | goto init_error; | ||
| 232 | } | 226 | } |
| 233 | 227 | ||
| 228 | return 0; | ||
| 229 | } | ||
| 230 | |||
| 231 | int st_sensors_init_sensor(struct iio_dev *indio_dev, | ||
| 232 | struct st_sensors_platform_data *pdata) | ||
| 233 | { | ||
| 234 | struct st_sensor_data *sdata = iio_priv(indio_dev); | ||
| 235 | int err = 0; | ||
| 236 | |||
| 237 | mutex_init(&sdata->tb.buf_lock); | ||
| 238 | |||
| 239 | if (pdata) | ||
| 240 | err = st_sensors_set_drdy_int_pin(indio_dev, pdata); | ||
| 241 | |||
| 234 | err = st_sensors_set_enable(indio_dev, false); | 242 | err = st_sensors_set_enable(indio_dev, false); |
| 235 | if (err < 0) | 243 | if (err < 0) |
| 236 | goto init_error; | 244 | goto init_error; |
| @@ -266,6 +274,9 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable) | |||
| 266 | u8 drdy_mask; | 274 | u8 drdy_mask; |
| 267 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 275 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
| 268 | 276 | ||
| 277 | if (!sdata->sensor->drdy_irq.addr) | ||
| 278 | return 0; | ||
| 279 | |||
| 269 | /* Enable/Disable the interrupt generator 1. */ | 280 | /* Enable/Disable the interrupt generator 1. */ |
| 270 | if (sdata->sensor->drdy_irq.ig1.en_addr > 0) { | 281 | if (sdata->sensor->drdy_irq.ig1.en_addr > 0) { |
| 271 | err = st_sensors_write_data_with_mask(indio_dev, | 282 | err = st_sensors_write_data_with_mask(indio_dev, |
