diff options
author | Denis CIOCCA <denis.ciocca@st.com> | 2013-06-19 04:28:00 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2013-08-03 13:40:28 -0400 |
commit | 23cde4d65cc7d11e2048d2b240cdf13927ac50d0 (patch) | |
tree | 3fd2d23f8c092056244e14703bce9842c203ba13 /drivers/iio/common | |
parent | 36e607a16b8def1b184d48a4489b716d6dbe3379 (diff) |
iio: Added ST-sensors platform data to select the DRDY interrupt pin
This patch add support to redirect the DRDY interrupt on INT1 or INT2
on accelerometer and pressure sensors.
Signed-off-by: Denis Ciocca <denis.ciocca@st.com>
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 | 41 |
1 files changed, 36 insertions, 5 deletions
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c index 865b1781df66..965ee22d3ac8 100644 --- a/drivers/iio/common/st_sensors/st_sensors_core.c +++ b/drivers/iio/common/st_sensors/st_sensors_core.c | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | static inline u32 st_sensors_get_unaligned_le24(const u8 *p) | 23 | static inline u32 st_sensors_get_unaligned_le24(const u8 *p) |
24 | { | 24 | { |
25 | return ((s32)((p[0] | p[1] << 8 | p[2] << 16) << 8) >> 8); | 25 | return (s32)((p[0] | p[1] << 8 | p[2] << 16) << 8) >> 8; |
26 | } | 26 | } |
27 | 27 | ||
28 | static int st_sensors_write_data_with_mask(struct iio_dev *indio_dev, | 28 | static int st_sensors_write_data_with_mask(struct iio_dev *indio_dev, |
@@ -118,7 +118,7 @@ st_sensors_match_odr_error: | |||
118 | } | 118 | } |
119 | 119 | ||
120 | static int st_sensors_set_fullscale(struct iio_dev *indio_dev, | 120 | static int st_sensors_set_fullscale(struct iio_dev *indio_dev, |
121 | unsigned int fs) | 121 | unsigned int fs) |
122 | { | 122 | { |
123 | int err, i = 0; | 123 | int err, i = 0; |
124 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 124 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
@@ -198,13 +198,39 @@ 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 | int st_sensors_init_sensor(struct iio_dev *indio_dev, |
202 | struct st_sensors_platform_data *pdata) | ||
202 | { | 203 | { |
203 | int err; | 204 | int err; |
204 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 205 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
205 | 206 | ||
206 | mutex_init(&sdata->tb.buf_lock); | 207 | mutex_init(&sdata->tb.buf_lock); |
207 | 208 | ||
209 | switch (pdata->drdy_int_pin) { | ||
210 | case 1: | ||
211 | if (sdata->sensor->drdy_irq.mask_int1 == 0) { | ||
212 | dev_err(&indio_dev->dev, | ||
213 | "DRDY on INT1 not available.\n"); | ||
214 | err = -EINVAL; | ||
215 | goto init_error; | ||
216 | } | ||
217 | sdata->drdy_int_pin = 1; | ||
218 | break; | ||
219 | case 2: | ||
220 | if (sdata->sensor->drdy_irq.mask_int2 == 0) { | ||
221 | dev_err(&indio_dev->dev, | ||
222 | "DRDY on INT2 not available.\n"); | ||
223 | err = -EINVAL; | ||
224 | goto init_error; | ||
225 | } | ||
226 | sdata->drdy_int_pin = 2; | ||
227 | break; | ||
228 | default: | ||
229 | dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n"); | ||
230 | err = -EINVAL; | ||
231 | goto init_error; | ||
232 | } | ||
233 | |||
208 | err = st_sensors_set_enable(indio_dev, false); | 234 | err = st_sensors_set_enable(indio_dev, false); |
209 | if (err < 0) | 235 | if (err < 0) |
210 | goto init_error; | 236 | goto init_error; |
@@ -234,6 +260,7 @@ EXPORT_SYMBOL(st_sensors_init_sensor); | |||
234 | int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable) | 260 | int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable) |
235 | { | 261 | { |
236 | int err; | 262 | int err; |
263 | u8 drdy_mask; | ||
237 | struct st_sensor_data *sdata = iio_priv(indio_dev); | 264 | struct st_sensor_data *sdata = iio_priv(indio_dev); |
238 | 265 | ||
239 | /* Enable/Disable the interrupt generator 1. */ | 266 | /* Enable/Disable the interrupt generator 1. */ |
@@ -245,10 +272,14 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable) | |||
245 | goto st_accel_set_dataready_irq_error; | 272 | goto st_accel_set_dataready_irq_error; |
246 | } | 273 | } |
247 | 274 | ||
275 | if (sdata->drdy_int_pin == 1) | ||
276 | drdy_mask = sdata->sensor->drdy_irq.mask_int1; | ||
277 | else | ||
278 | drdy_mask = sdata->sensor->drdy_irq.mask_int2; | ||
279 | |||
248 | /* Enable/Disable the interrupt generator for data ready. */ | 280 | /* Enable/Disable the interrupt generator for data ready. */ |
249 | err = st_sensors_write_data_with_mask(indio_dev, | 281 | err = st_sensors_write_data_with_mask(indio_dev, |
250 | sdata->sensor->drdy_irq.addr, | 282 | sdata->sensor->drdy_irq.addr, drdy_mask, (int)enable); |
251 | sdata->sensor->drdy_irq.mask, (int)enable); | ||
252 | 283 | ||
253 | st_accel_set_dataready_irq_error: | 284 | st_accel_set_dataready_irq_error: |
254 | return err; | 285 | return err; |