summaryrefslogtreecommitdiffstats
path: root/drivers/iio/common
diff options
context:
space:
mode:
authorDenis CIOCCA <denis.ciocca@st.com>2013-06-19 04:28:00 -0400
committerJonathan Cameron <jic23@kernel.org>2013-08-03 13:40:28 -0400
commit23cde4d65cc7d11e2048d2b240cdf13927ac50d0 (patch)
tree3fd2d23f8c092056244e14703bce9842c203ba13 /drivers/iio/common
parent36e607a16b8def1b184d48a4489b716d6dbe3379 (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.c41
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
23static inline u32 st_sensors_get_unaligned_le24(const u8 *p) 23static 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
28static int st_sensors_write_data_with_mask(struct iio_dev *indio_dev, 28static 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
120static int st_sensors_set_fullscale(struct iio_dev *indio_dev, 120static 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}
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) 201int 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);
234int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable) 260int 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
253st_accel_set_dataready_irq_error: 284st_accel_set_dataready_irq_error:
254 return err; 285 return err;