aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLee Jones <lee.jones@linaro.org>2013-09-16 12:02:00 -0400
committerJonathan Cameron <jic23@kernel.org>2013-09-21 14:24:03 -0400
commit38d1c6a9116bd9642ebcb027ac66305590aa8488 (patch)
tree068330a74e5e4f649a7eced16256ffe6ff2c50ee /drivers
parent9d6c39867cc6cdfb6198ec83165b72e0f14ef8b6 (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')
-rw-r--r--drivers/iio/common/st_sensors/st_sensors_core.c33
-rw-r--r--drivers/iio/pressure/st_pressure_core.c3
2 files changed, 24 insertions, 12 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}
199EXPORT_SYMBOL(st_sensors_set_axis_enable); 199EXPORT_SYMBOL(st_sensors_set_axis_enable);
200 200
201int st_sensors_init_sensor(struct iio_dev *indio_dev, 201static 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
231int 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,
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 93bff9ba05d6..3abada26c3c2 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -254,7 +254,8 @@ int st_press_common_probe(struct iio_dev *indio_dev,
254 254
255 pdata->odr = pdata->sensor->odr.odr_avl[0].hz; 255 pdata->odr = pdata->sensor->odr.odr_avl[0].hz;
256 256
257 if (!plat_data) 257 /* Some devices don't support a data ready pin. */
258 if (!plat_data && pdata->sensor->drdy_irq.addr)
258 plat_data = 259 plat_data =
259 (struct st_sensors_platform_data *)&default_press_pdata; 260 (struct st_sensors_platform_data *)&default_press_pdata;
260 261