> In order to allow sensors to advertise tap event capability and report tap > events, define a new struct iio_event_spec array that includes a tap event > spec, and a new struct iio_chan_spec array that references the new > iio_event_spec array; for the LSM6DSV chip family, use the new > iio_chan_spec array and define an event source for tap events. > Tested on LSMDSV16X. > > Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi > --- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 1 + > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 55 +++++++++++++++++++- > 2 files changed, 54 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > index 3b90261e6bb1..5d820f2a0bce 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h > @@ -245,6 +245,7 @@ struct st_lsm6dsx_shub_settings { > > enum st_lsm6dsx_event_id { > ST_LSM6DSX_EVENT_WAKEUP, > + ST_LSM6DSX_EVENT_TAP, > ST_LSM6DSX_EVENT_MAX > }; > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 562544636f36..55cd63643c52 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -105,6 +105,21 @@ static const struct iio_event_spec st_lsm6dsx_ev_motion[] = { > }, > }; > > +static const struct iio_event_spec st_lsm6dsx_ev_motion_tap[] = { > + { > + .type = IIO_EV_TYPE_THRESH, > + .dir = IIO_EV_DIR_EITHER, > + .mask_separate = BIT(IIO_EV_INFO_VALUE) | > + BIT(IIO_EV_INFO_ENABLE), > + }, > + { > + .type = IIO_EV_TYPE_GESTURE, > + .dir = IIO_EV_DIR_SINGLETAP, > + .mask_separate = BIT(IIO_EV_INFO_VALUE) | > + BIT(IIO_EV_INFO_ENABLE), > + }, > +}; > + > static const struct iio_chan_spec st_lsm6dsx_acc_channels[] = { > ST_LSM6DSX_CHANNEL_ACC(0x28, IIO_MOD_X, 0, st_lsm6dsx_ev_motion), > ST_LSM6DSX_CHANNEL_ACC(0x2a, IIO_MOD_Y, 1, st_lsm6dsx_ev_motion), > @@ -119,6 +134,13 @@ static const struct iio_chan_spec st_lsm6ds0_acc_channels[] = { > IIO_CHAN_SOFT_TIMESTAMP(3), > }; > > +static const struct iio_chan_spec st_lsm6dsx_acc_tap_channels[] = { > + ST_LSM6DSX_CHANNEL_ACC(0x28, IIO_MOD_X, 0, st_lsm6dsx_ev_motion_tap), > + ST_LSM6DSX_CHANNEL_ACC(0x2a, IIO_MOD_Y, 1, st_lsm6dsx_ev_motion_tap), > + ST_LSM6DSX_CHANNEL_ACC(0x2c, IIO_MOD_Z, 2, st_lsm6dsx_ev_motion_tap), > + IIO_CHAN_SOFT_TIMESTAMP(3), > +}; > + > static const struct iio_chan_spec st_lsm6dsx_gyro_channels[] = { > ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, 0x22, IIO_MOD_X, 0), > ST_LSM6DSX_CHANNEL(IIO_ANGL_VEL, 0x24, IIO_MOD_Y, 1), > @@ -1250,8 +1272,8 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > }, > .channels = { > [ST_LSM6DSX_ID_ACC] = { > - .chan = st_lsm6dsx_acc_channels, > - .len = ARRAY_SIZE(st_lsm6dsx_acc_channels), > + .chan = st_lsm6dsx_acc_tap_channels, > + .len = ARRAY_SIZE(st_lsm6dsx_acc_tap_channels), > }, > [ST_LSM6DSX_ID_GYRO] = { > .chan = st_lsm6dsx_gyro_channels, > @@ -1426,6 +1448,30 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { > .status_y_mask = BIT(1), > .status_x_mask = BIT(2), > }, > + [ST_LSM6DSX_EVENT_TAP] = { > + .x_value = { > + .addr = 0x57, > + .mask = GENMASK(4, 0), > + }, > + .y_value = { > + .addr = 0x58, > + .mask = GENMASK(4, 0), > + }, > + .z_value = { > + .addr = 0x59, > + .mask = GENMASK(4, 0), > + }, > + .enable_mask = BIT(6), > + .enable_axis_reg = 0x56, > + .enable_x_mask = BIT(3), > + .enable_y_mask = BIT(2), > + .enable_z_mask = BIT(1), > + .status_reg = 0x46, > + .status_mask = BIT(5), > + .status_x_mask = BIT(2), > + .status_y_mask = BIT(1), > + .status_z_mask = BIT(0), > + }, > }, > }, > }, > @@ -1939,6 +1985,8 @@ st_lsm6dsx_get_event_id(enum iio_event_type type) > switch (type) { > case IIO_EV_TYPE_THRESH: > return ST_LSM6DSX_EVENT_WAKEUP; > + case IIO_EV_TYPE_GESTURE: > + return ST_LSM6DSX_EVENT_TAP; > default: > return ST_LSM6DSX_EVENT_MAX; > } > @@ -2606,6 +2654,9 @@ static bool st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw) > events_found = st_lsm6dsx_report_events(hw, ST_LSM6DSX_EVENT_WAKEUP, > IIO_EV_TYPE_THRESH, > IIO_EV_DIR_EITHER); > + events_found |= st_lsm6dsx_report_events(hw, ST_LSM6DSX_EVENT_TAP, > + IIO_EV_TYPE_GESTURE, > + IIO_EV_DIR_SINGLETAP); > > return events_found; > } > -- > 2.39.5 >