> The st_lsm6dsx_acc_channels array of struct iio_chan_spec has a non-NULL > event_spec field, indicating support for IIO events. However, event > detection is not supported for all sensors, and if userspace tries to > configure accelerometer wakeup events on a sensor device that does not > support them (e.g. LSM6DS0), st_lsm6dsx_write_event() dereferences a NULL > pointer when trying to write to the wakeup register. > Define an additional struct iio_chan_spec array whose members have a NULL > event_spec field, and use this array instead of st_lsm6dsx_acc_channels for > sensors without event detection capability. > > Fixes: b5969abfa8b8 ("iio: imu: st_lsm6dsx: add motion events") > Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi > --- > drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > index 216160549b5a..a09df9d772dd 100644 > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c > @@ -103,6 +103,13 @@ static const struct iio_chan_spec st_lsm6dsx_acc_channels[] = { > IIO_CHAN_SOFT_TIMESTAMP(3), > }; > > +static const struct iio_chan_spec st_lsm6ds0_acc_channels[] = { > + ST_LSM6DSX_CHANNEL(IIO_ACCEL, 0x28, IIO_MOD_X, 0), > + ST_LSM6DSX_CHANNEL(IIO_ACCEL, 0x2a, IIO_MOD_Y, 1), > + ST_LSM6DSX_CHANNEL(IIO_ACCEL, 0x2c, IIO_MOD_Z, 2), > + 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), > @@ -144,8 +151,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_lsm6ds0_acc_channels, > + .len = ARRAY_SIZE(st_lsm6ds0_acc_channels), > }, > [ST_LSM6DSX_ID_GYRO] = { > .chan = st_lsm6ds0_gyro_channels, > @@ -1445,8 +1452,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_lsm6ds0_acc_channels, > + .len = ARRAY_SIZE(st_lsm6ds0_acc_channels), > }, > [ST_LSM6DSX_ID_GYRO] = { > .chan = st_lsm6dsx_gyro_channels, > -- > 2.39.5 >