iio: st_sensors: disable regulators after device unregistration
authorAlexandru Ardelean <aardelean@deviqon.com>
Mon, 23 Aug 2021 11:22:00 +0000 (14:22 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 18:16:46 +0000 (19:16 +0100)
[ Upstream commit 9f0b3e0cc0c88618aa9e5cecef747b1337ae0a5d ]

Up until commit ea7e586bdd331 ("iio: st_sensors: move regulator retrieveal
to core") only the ST pressure driver seems to have had any regulator
disable. After that commit, the regulator handling was moved into the
common st_sensors logic.

In all instances of this regulator handling, the regulators were disabled
before unregistering the IIO device.
This can cause issues where the device would be powered down and still be
available to userspace, allowing it to send invalid/garbage data.

This change moves the st_sensors_power_disable() after the common probe
functions. These common probe functions also handle unregistering the IIO
device.

Fixes: 774487611c949 ("iio: pressure-core: st: Provide support for the Vdd power supply")
Fixes: ea7e586bdd331 ("iio: st_sensors: move regulator retrieveal to core")
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Denis CIOCCA <denis.ciocca@st.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Alexandru Ardelean <aardelean@deviqon.com>
Link: https://lore.kernel.org/r/20210823112204.243255-2-aardelean@deviqon.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iio/accel/st_accel_i2c.c
drivers/iio/accel/st_accel_spi.c
drivers/iio/gyro/st_gyro_i2c.c
drivers/iio/gyro/st_gyro_spi.c
drivers/iio/magnetometer/st_magn_i2c.c
drivers/iio/magnetometer/st_magn_spi.c
drivers/iio/pressure/st_pressure_i2c.c
drivers/iio/pressure/st_pressure_spi.c

index f711756e41e3d7b7fca752cc076fcbe75427f31f..cba57459e90abb41567a04b58ac1b329ab27a8eb 100644 (file)
@@ -193,10 +193,10 @@ static int st_accel_i2c_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
-       st_sensors_power_disable(indio_dev);
-
        st_accel_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index bb45d9ff95b859f95b54568edd04af6581e80d6a..5167fae1ee8ec4f4ac59d4b2863b27cc54f509f6 100644 (file)
@@ -143,10 +143,10 @@ static int st_accel_spi_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
-       st_sensors_power_disable(indio_dev);
-
        st_accel_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index 3ef86e16ee6565e6e0fbdc8250811c113d29f4ce..a8164fe48b85729911d03243bbe9e8578ccc6dd0 100644 (file)
@@ -106,10 +106,10 @@ static int st_gyro_i2c_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
-       st_sensors_power_disable(indio_dev);
-
        st_gyro_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index 41d835493347cee934fb41d834a2955ed8ee6629..9d8916871b4bf9611fdb5dc279eef3832976cb9a 100644 (file)
@@ -110,10 +110,10 @@ static int st_gyro_spi_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
-       st_sensors_power_disable(indio_dev);
-
        st_gyro_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index 2dfe4ee99591bfec1abd58409679fc734b380ca4..fa78f0a3b53eaec198284cbaf5cf2147b4325851 100644 (file)
@@ -102,10 +102,10 @@ static int st_magn_i2c_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
-       st_sensors_power_disable(indio_dev);
-
        st_magn_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index fba97879639525d4480c01819cb83c9dadb02fa5..ff43cbf61b056d4bbf2fc4c33748d4b01e92249f 100644 (file)
@@ -96,10 +96,10 @@ static int st_magn_spi_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
-       st_sensors_power_disable(indio_dev);
-
        st_magn_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index 52fa98f24478df026b671f54102c4a5342906952..6215de677017e1ee9cce71b366aa58412f1904d2 100644 (file)
@@ -119,10 +119,10 @@ static int st_press_i2c_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
-       st_sensors_power_disable(indio_dev);
-
        st_press_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }
 
index ee393df54cee8399e1ba4418cf019ed125d8470a..5001aae8f00b87fceb19618366727ac1f53c12bc 100644 (file)
@@ -102,10 +102,10 @@ static int st_press_spi_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
-       st_sensors_power_disable(indio_dev);
-
        st_press_common_remove(indio_dev);
 
+       st_sensors_power_disable(indio_dev);
+
        return 0;
 }