diff options
Diffstat (limited to 'drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c')
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c index fb739c883d4..f5108a7526e 100644 --- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c +++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c @@ -20,7 +20,9 @@ #define ST_LSM6DS3_SRC_FUNC_ADDR 0x53 #define ST_LSM6DS3_FIFO_DATA_AVL_ADDR 0x3b +#define ST_LSM6DS3_TAP_FUNC_ADDR 0x1C +#define ST_LSM6DS3_SRC_SIGN_MOTION_DATA_AVL 0x40 #define ST_LSM6DS3_SRC_STEP_DETECTOR_DATA_AVL 0x10 #define ST_LSM6DS3_SRC_TILT_DATA_AVL 0x20 #define ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL 0x80 @@ -51,7 +53,7 @@ irqreturn_t st_lsm6ds3_save_timestamp(int irq, void *private) static void st_lsm6ds3_irq_management(struct work_struct *data_work) { struct lsm6ds3_data *cdata; - u8 src_value = 0x00, src_fifo = 0x00; + u8 src_value = 0x00, src_fifo = 0x00, tap_value = 0x00, tap_cfg = 0x00, int1_cfg = 0x00, tap_thresh = 0x00; cdata = container_of((struct work_struct *)data_work, struct lsm6ds3_data, data_work); @@ -59,6 +61,14 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) cdata->tf->read(cdata, ST_LSM6DS3_SRC_FUNC_ADDR, 1, &src_value, true); cdata->tf->read(cdata, ST_LSM6DS3_FIFO_DATA_AVL_ADDR, 1, &src_fifo, true); + cdata->tf->read(cdata, ST_LSM6DS3_TAP_FUNC_ADDR, 1, + &tap_value, true); + cdata->tf->read(cdata, 0x58, 1, + &tap_cfg, true); + cdata->tf->read(cdata, 0x5E, 1, + &int1_cfg, true); + cdata->tf->read(cdata, 0x59, 1, + &tap_thresh, true); if (src_fifo & ST_LSM6DS3_FIFO_DATA_AVL) { if (src_fifo & ST_LSM6DS3_FIFO_DATA_OVR) { @@ -76,17 +86,27 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), cdata->timestamp); - if (cdata->sign_motion_event_ready) { - iio_push_event(cdata->indio_dev[ - ST_INDIO_DEV_SIGN_MOTION], - IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, - 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), - cdata->timestamp); - - cdata->sign_motion_event_ready = false; - } +// if (cdata->sign_motion_event_ready) { +// iio_push_event(cdata->indio_dev[ +// ST_INDIO_DEV_SIGN_MOTION], +// IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, +// 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), +// cdata->timestamp); +// +// cdata->sign_motion_event_ready = false; +// } } + if (cdata->sign_motion_event_ready && + (tap_value & ST_LSM6DS3_SRC_SIGN_MOTION_DATA_AVL)) { + printk("Firing Sig motion event. Tap value: %x, Tap cfg: %x, Int cfg: %x, Tap thresh: %x\n", tap_value, tap_cfg, int1_cfg, tap_thresh); + iio_push_event(cdata->indio_dev[ + ST_INDIO_DEV_SIGN_MOTION], + IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, + 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), + cdata->timestamp); + cdata->sign_motion_event_ready = false; + } if (src_value & ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL) { iio_trigger_poll_chained( cdata->trig[ST_INDIO_DEV_STEP_COUNTER], 0); |