Skip to content

Commit 5dbbd19

Browse files
Martin Fuzzeyjic23
authored andcommitted
iio: mma8452: Add support for transient event debouncing
Allow the debouce counter for transient events to be configured using the sysfs attribute events/in_accel_thresh_rising_period Signed-off-by: Martin Fuzzey <mfuzzey@parkeon.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
1 parent 28e3427 commit 5dbbd19

File tree

1 file changed

+65
-11
lines changed

1 file changed

+65
-11
lines changed

drivers/iio/accel/mma8452.c

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
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+
127134
static 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+
142161
static 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

311347
static 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

324377
static 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

Comments
 (0)