summaryrefslogtreecommitdiff
path: root/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c')
-rw-r--r--drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c40
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);