| From foo@baz Thu Mar 22 14:57:32 CET 2018 |
| From: Shrirang Bagul <shrirang.bagul@canonical.com> |
| Date: Wed, 19 Apr 2017 22:05:00 +0800 |
| Subject: iio: st_pressure: st_accel: Initialise sensor platform data properly |
| |
| From: Shrirang Bagul <shrirang.bagul@canonical.com> |
| |
| |
| [ Upstream commit 7383d44b84c94aaca4bf695a6bd8a69f2295ef1a ] |
| |
| This patch fixes the sensor platform data initialisation for st_pressure |
| and st_accel device drivers. Without this patch, the driver fails to |
| register the sensors when the user removes and re-loads the driver. |
| |
| 1. Unload the kernel modules for st_pressure |
| $ sudo rmmod st_pressure_i2c |
| $ sudo rmmod st_pressure |
| |
| 2. Re-load the driver |
| $ sudo insmod st_pressure |
| $ sudo insmod st_pressure_i2c |
| |
| Signed-off-by: Jonathan Cameron <jic23@kernel.org> |
| Acked-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/accel/st_accel_core.c | 7 ++++--- |
| drivers/iio/pressure/st_pressure_core.c | 8 ++++---- |
| 2 files changed, 8 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/iio/accel/st_accel_core.c |
| +++ b/drivers/iio/accel/st_accel_core.c |
| @@ -628,6 +628,8 @@ static const struct iio_trigger_ops st_a |
| int st_accel_common_probe(struct iio_dev *indio_dev) |
| { |
| struct st_sensor_data *adata = iio_priv(indio_dev); |
| + struct st_sensors_platform_data *pdata = |
| + (struct st_sensors_platform_data *)adata->dev->platform_data; |
| int irq = adata->get_irq_data_ready(indio_dev); |
| int err; |
| |
| @@ -652,9 +654,8 @@ int st_accel_common_probe(struct iio_dev |
| &adata->sensor_settings->fs.fs_avl[0]; |
| adata->odr = adata->sensor_settings->odr.odr_avl[0].hz; |
| |
| - if (!adata->dev->platform_data) |
| - adata->dev->platform_data = |
| - (struct st_sensors_platform_data *)&default_accel_pdata; |
| + if (!pdata) |
| + pdata = (struct st_sensors_platform_data *)&default_accel_pdata; |
| |
| err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data); |
| if (err < 0) |
| --- a/drivers/iio/pressure/st_pressure_core.c |
| +++ b/drivers/iio/pressure/st_pressure_core.c |
| @@ -436,6 +436,8 @@ static const struct iio_trigger_ops st_p |
| int st_press_common_probe(struct iio_dev *indio_dev) |
| { |
| struct st_sensor_data *press_data = iio_priv(indio_dev); |
| + struct st_sensors_platform_data *pdata = |
| + (struct st_sensors_platform_data *)press_data->dev->platform_data; |
| int irq = press_data->get_irq_data_ready(indio_dev); |
| int err; |
| |
| @@ -464,10 +466,8 @@ int st_press_common_probe(struct iio_dev |
| press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz; |
| |
| /* Some devices don't support a data ready pin. */ |
| - if (!press_data->dev->platform_data && |
| - press_data->sensor_settings->drdy_irq.addr) |
| - press_data->dev->platform_data = |
| - (struct st_sensors_platform_data *)&default_press_pdata; |
| + if (!pdata && press_data->sensor_settings->drdy_irq.addr) |
| + pdata = (struct st_sensors_platform_data *)&default_press_pdata; |
| |
| err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data); |
| if (err < 0) |