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; |
