3838#define MMA8452_TRANSIENT_SRC_ZTRANSE BIT(5)
3939#define MMA8452_TRANSIENT_THS 0x1f
4040#define MMA8452_TRANSIENT_THS_MASK 0x7f
41+ #define MMA8452_TRANSIENT_COUNT 0x20
4142#define MMA8452_OFF_X 0x2f
4243#define MMA8452_OFF_Y 0x30
4344#define MMA8452_OFF_Z 0x31
@@ -124,6 +125,12 @@ static int mma8452_get_int_plus_micros_index(const int (*vals)[2], int n,
124125 return - EINVAL ;
125126}
126127
128+ static int mma8452_get_odr_index (struct mma8452_data * data )
129+ {
130+ return (data -> ctrl_reg1 & MMA8452_CTRL_DR_MASK ) >>
131+ MMA8452_CTRL_DR_SHIFT ;
132+ }
133+
127134static const int mma8452_samp_freq [8 ][2 ] = {
128135 {800 , 0 }, {400 , 0 }, {200 , 0 }, {100 , 0 }, {50 , 0 }, {12 , 500000 },
129136 {6 , 250000 }, {1 , 560000 }
@@ -139,6 +146,18 @@ static const int mma8452_scales[3][2] = {
139146 {0 , 9577 }, {0 , 19154 }, {0 , 38307 }
140147};
141148
149+ /* Datasheet table 35 (step time vs sample frequency) */
150+ static const int mma8452_transient_time_step_us [8 ] = {
151+ 1250 ,
152+ 2500 ,
153+ 5000 ,
154+ 10000 ,
155+ 20000 ,
156+ 20000 ,
157+ 20000 ,
158+ 20000
159+ };
160+
142161static ssize_t mma8452_show_samp_freq_avail (struct device * dev ,
143162 struct device_attribute * attr , char * buf )
144163{
@@ -198,8 +217,7 @@ static int mma8452_read_raw(struct iio_dev *indio_dev,
198217 * val2 = mma8452_scales [i ][1 ];
199218 return IIO_VAL_INT_PLUS_MICRO ;
200219 case IIO_CHAN_INFO_SAMP_FREQ :
201- i = (data -> ctrl_reg1 & MMA8452_CTRL_DR_MASK ) >>
202- MMA8452_CTRL_DR_SHIFT ;
220+ i = mma8452_get_odr_index (data );
203221 * val = mma8452_samp_freq [i ][0 ];
204222 * val2 = mma8452_samp_freq [i ][1 ];
205223 return IIO_VAL_INT_PLUS_MICRO ;
@@ -297,15 +315,33 @@ static int mma8452_read_thresh(struct iio_dev *indio_dev,
297315 int * val , int * val2 )
298316{
299317 struct mma8452_data * data = iio_priv (indio_dev );
300- int ret ;
318+ int ret , us ;
301319
302- ret = i2c_smbus_read_byte_data (data -> client , MMA8452_TRANSIENT_THS );
303- if (ret < 0 )
304- return ret ;
320+ switch (info ) {
321+ case IIO_EV_INFO_VALUE :
322+ ret = i2c_smbus_read_byte_data (data -> client ,
323+ MMA8452_TRANSIENT_THS );
324+ if (ret < 0 )
325+ return ret ;
326+
327+ * val = ret & MMA8452_TRANSIENT_THS_MASK ;
328+ return IIO_VAL_INT ;
305329
306- * val = ret & MMA8452_TRANSIENT_THS_MASK ;
330+ case IIO_EV_INFO_PERIOD :
331+ ret = i2c_smbus_read_byte_data (data -> client ,
332+ MMA8452_TRANSIENT_COUNT );
333+ if (ret < 0 )
334+ return ret ;
335+
336+ us = ret * mma8452_transient_time_step_us [
337+ mma8452_get_odr_index (data )];
338+ * val = us / USEC_PER_SEC ;
339+ * val2 = us % USEC_PER_SEC ;
340+ return IIO_VAL_INT_PLUS_MICRO ;
307341
308- return IIO_VAL_INT ;
342+ default :
343+ return - EINVAL ;
344+ }
309345}
310346
311347static int mma8452_write_thresh (struct iio_dev * indio_dev ,
@@ -316,9 +352,26 @@ static int mma8452_write_thresh(struct iio_dev *indio_dev,
316352 int val , int val2 )
317353{
318354 struct mma8452_data * data = iio_priv (indio_dev );
355+ int steps ;
319356
320- return mma8452_change_config (data , MMA8452_TRANSIENT_THS ,
321- val & MMA8452_TRANSIENT_THS_MASK );
357+ switch (info ) {
358+ case IIO_EV_INFO_VALUE :
359+ return mma8452_change_config (data , MMA8452_TRANSIENT_THS ,
360+ val & MMA8452_TRANSIENT_THS_MASK );
361+
362+ case IIO_EV_INFO_PERIOD :
363+ steps = (val * USEC_PER_SEC + val2 ) /
364+ mma8452_transient_time_step_us [
365+ mma8452_get_odr_index (data )];
366+
367+ if (steps > 0xff )
368+ return - EINVAL ;
369+
370+ return mma8452_change_config (data , MMA8452_TRANSIENT_COUNT ,
371+ steps );
372+ default :
373+ return - EINVAL ;
374+ }
322375}
323376
324377static int mma8452_read_event_config (struct iio_dev * indio_dev ,
@@ -456,7 +509,8 @@ static const struct iio_event_spec mma8452_transient_event[] = {
456509 .type = IIO_EV_TYPE_THRESH ,
457510 .dir = IIO_EV_DIR_RISING ,
458511 .mask_separate = BIT (IIO_EV_INFO_ENABLE ),
459- .mask_shared_by_type = BIT (IIO_EV_INFO_VALUE )
512+ .mask_shared_by_type = BIT (IIO_EV_INFO_VALUE ) |
513+ BIT (IIO_EV_INFO_PERIOD )
460514 },
461515};
462516
0 commit comments