> Report iio motion events to iio subsystem > > Signed-off-by: Sean Nyekjaer <sean@xxxxxxxxxx> > --- > > Changes since v1: > * none > > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 52 ++++++++++++++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 0503abab6efc..acc653d5e00e 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -39,6 +39,7 @@ > #include <linux/kernel.h> > #include <linux/module.h> > #include <linux/delay.h> > +#include <linux/iio/events.h> > #include <linux/iio/iio.h> > #include <linux/iio/sysfs.h> > #include <linux/interrupt.h> > @@ -76,6 +77,12 @@ > #define ST_LSM6DSX_REG_GYRO_OUT_Y_L_ADDR 0x24 > #define ST_LSM6DSX_REG_GYRO_OUT_Z_L_ADDR 0x26 > > +#define ST_LSM6DSX_REG_WAKE_UP_SRC_ADDR 0x1B > +#define ST_LSM6DSX_REG_WAKE_UP_SRC_Z_WU_MASK BIT(0) > +#define ST_LSM6DSX_REG_WAKE_UP_SRC_Y_WU_MASK BIT(1) > +#define ST_LSM6DSX_REG_WAKE_UP_SRC_X_WU_MASK BIT(2) > +#define ST_LSM6DSX_REG_WAKE_UP_SRC_WU_MASK BIT(3) > + > #define ST_LSM6DSX_REG_TAP_CFG_ADDR 0x58 > #define ST_LSM6DSX_REG_TAP_CFG_INT_EN_MASK BIT(7) > > @@ -1212,6 +1219,39 @@ int st_lsm6dsx_event_setup(int id, struct st_lsm6dsx_hw *hw) > > return err; > } > +int st_lsm6dsx_report_motion_event(struct st_lsm6dsx_hw *hw, int data) > +{ > + s64 timestamp = iio_get_time_ns(hw->iio_devs[ST_LSM6DSX_ID_ACC]); > + > + if (data & ST_LSM6DSX_REG_WAKE_UP_SRC_Z_WU_MASK) > + iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], > + IIO_MOD_EVENT_CODE(IIO_ACCEL, > + 0, > + IIO_MOD_Z, > + IIO_EV_TYPE_THRESH, > + IIO_EV_DIR_EITHER), > + timestamp); > + > + if (data & ST_LSM6DSX_REG_WAKE_UP_SRC_Y_WU_MASK) > + iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], > + IIO_MOD_EVENT_CODE(IIO_ACCEL, > + 0, > + IIO_MOD_Y, > + IIO_EV_TYPE_THRESH, > + IIO_EV_DIR_EITHER), > + timestamp); > + > + if (data & ST_LSM6DSX_REG_WAKE_UP_SRC_X_WU_MASK) > + iio_push_event(hw->iio_devs[ST_LSM6DSX_ID_ACC], > + IIO_MOD_EVENT_CODE(IIO_ACCEL, > + 0, > + IIO_MOD_X, > + IIO_EV_TYPE_THRESH, > + IIO_EV_DIR_EITHER), > + timestamp); > + > + return 0; > +} > > static irqreturn_t st_lsm6dsx_handler_irq(int irq, void *private) > { > @@ -1222,7 +1262,19 @@ static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private) > { > struct st_lsm6dsx_hw *hw = private; > int count = 0; > + int data, err; > + > + if (hw->enable_event) { > + err = regmap_read(hw->regmap, > + ST_LSM6DSX_REG_WAKE_UP_SRC_ADDR, &data); I think we can move the ST_LSM6DSX_REG_WAKE_UP_SRC_ADDR read in st_lsm6dsx_report_motion_event (and rename it) and avoid goto try_fifo > + if (err < 0) > + goto try_fifo; > + > + if (data & ST_LSM6DSX_REG_WAKE_UP_SRC_WU_MASK) > + st_lsm6dsx_report_motion_event(hw, data); > + } > > +try_fifo: > if (hw->sip > 0) { > mutex_lock(&hw->fifo_lock); > count = st_lsm6dsx_read_fifo(hw); > -- > 2.22.0 >
Attachment:
signature.asc
Description: PGP signature