Am Dienstag, dem 22.02.2022 um 10:42 +0800 schrieb haibo.chen@xxxxxxx: > From: Haibo Chen <haibo.chen@xxxxxxx> > > The original logic to get mma8452_data is wrong, the *dev point to > the device belong to iio_dev. we can't use this dev to find the > correct i2c_client. The original logic happen to work because it > finally use dev->driver_data to get iio_dev. Here use the API > to_i2c_client() is wrong and make reader confuse. To correct the > logic, it should be like this > > struct mma8452_data *data = iio_priv(dev_get_drvdata(dev)); > > But after commit 8b7651f25962 ("iio: iio_device_alloc(): Remove > unnecessary self drvdata"), the upper logic also can't work. > When try to show the avialable scale in userspace, will meet kernel > dump, kernel handle NULL pointer dereference. > > So use dev_to_iio_dev() to correct the logic. > > Fixes: c3cdd6e48e35 ("iio: mma8452: refactor for seperating chip > specific data") > Cc: <Stable@xxxxxxxxxxxxxxx> > Signed-off-by: Haibo Chen <haibo.chen@xxxxxxx> Reviewed-by: Martin Kepplinger <martink@xxxxxxxxx> thank you for this fix! > --- > drivers/iio/accel/mma8452.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/iio/accel/mma8452.c > b/drivers/iio/accel/mma8452.c > index 64b82b4503ad..0016bb947c10 100644 > --- a/drivers/iio/accel/mma8452.c > +++ b/drivers/iio/accel/mma8452.c > @@ -379,8 +379,8 @@ static ssize_t mma8452_show_scale_avail(struct > device *dev, > struct device_attribute > *attr, > char *buf) > { > - struct mma8452_data *data = iio_priv(i2c_get_clientdata( > - to_i2c_client(dev))); > + struct iio_dev *indio_dev = dev_to_iio_dev(dev); > + struct mma8452_data *data = iio_priv(indio_dev); > > return mma8452_show_int_plus_micros(buf, data->chip_info- > >mma_scales, > ARRAY_SIZE(data->chip_info->mma_scales));