iio: st_sensors: Call st_sensors_power_enable() from bus drivers
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 14 Apr 2021 19:54:51 +0000 (22:54 +0300)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 17 May 2021 12:54:22 +0000 (13:54 +0100)
In case we would initialize two IIO devices from one physical device,
we shouldn't have a clash on regulators. That's why move
st_sensors_power_enable() call from core to bus drivers.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210414195454.84183-4-andriy.shevchenko@linux.intel.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
12 files changed:
drivers/iio/accel/st_accel_core.c
drivers/iio/accel/st_accel_i2c.c
drivers/iio/accel/st_accel_spi.c
drivers/iio/gyro/st_gyro_core.c
drivers/iio/gyro/st_gyro_i2c.c
drivers/iio/gyro/st_gyro_spi.c
drivers/iio/magnetometer/st_magn_core.c
drivers/iio/magnetometer/st_magn_i2c.c
drivers/iio/magnetometer/st_magn_spi.c
drivers/iio/pressure/st_pressure_core.c
drivers/iio/pressure/st_pressure_i2c.c
drivers/iio/pressure/st_pressure_spi.c

index a1bd7e3b912e704db4adcc93eb4b40488a8bb498..5c258c1ca62dc060c542420d0955d8de9ac83255 100644 (file)
@@ -1260,13 +1260,9 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &accel_info;
 
-       err = st_sensors_power_enable(indio_dev);
-       if (err)
-               return err;
-
        err = st_sensors_verify_id(indio_dev);
        if (err < 0)
-               goto st_accel_power_off;
+               return err;
 
        adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
        indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
@@ -1275,10 +1271,8 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
        channels = devm_kmemdup(&indio_dev->dev,
                                adata->sensor_settings->ch,
                                channels_size, GFP_KERNEL);
-       if (!channels) {
-               err = -ENOMEM;
-               goto st_accel_power_off;
-       }
+       if (!channels)
+               return -ENOMEM;
 
        if (apply_acpi_orientation(indio_dev, channels))
                dev_warn(&indio_dev->dev,
@@ -1293,11 +1287,11 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
 
        err = st_sensors_init_sensor(indio_dev, pdata);
        if (err < 0)
-               goto st_accel_power_off;
+               return err;
 
        err = st_accel_allocate_ring(indio_dev);
        if (err < 0)
-               goto st_accel_power_off;
+               return err;
 
        if (adata->irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
@@ -1320,9 +1314,6 @@ st_accel_device_register_error:
                st_sensors_deallocate_trigger(indio_dev);
 st_accel_probe_trigger_error:
        st_accel_deallocate_ring(indio_dev);
-st_accel_power_off:
-       st_sensors_power_disable(indio_dev);
-
        return err;
 }
 EXPORT_SYMBOL(st_accel_common_probe);
@@ -1331,8 +1322,6 @@ void st_accel_common_remove(struct iio_dev *indio_dev)
 {
        struct st_sensor_data *adata = iio_priv(indio_dev);
 
-       st_sensors_power_disable(indio_dev);
-
        iio_device_unregister(indio_dev);
        if (adata->irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
index 360e16f2cadb9669d482d2c0c54ab384bf9ae848..95e305b88d5edb4b4c22326cdcafec08ab39da08 100644 (file)
@@ -174,16 +174,29 @@ static int st_accel_i2c_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
+       ret = st_sensors_power_enable(indio_dev);
+       if (ret)
+               return ret;
+
        ret = st_accel_common_probe(indio_dev);
        if (ret < 0)
-               return ret;
+               goto st_accel_power_off;
 
        return 0;
+
+st_accel_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return ret;
 }
 
 static int st_accel_i2c_remove(struct i2c_client *client)
 {
-       st_accel_common_remove(i2c_get_clientdata(client));
+       struct iio_dev *indio_dev = i2c_get_clientdata(client);
+
+       st_sensors_power_disable(indio_dev);
+
+       st_accel_common_remove(indio_dev);
 
        return 0;
 }
index 568ff1bae0eee679f761dcc3e5f1e802da9ef74d..83d3308ce5ccc395e61f3ee89d6b8d3924928473 100644 (file)
@@ -123,16 +123,29 @@ static int st_accel_spi_probe(struct spi_device *spi)
        if (err < 0)
                return err;
 
+       err = st_sensors_power_enable(indio_dev);
+       if (err)
+               return err;
+
        err = st_accel_common_probe(indio_dev);
        if (err < 0)
-               return err;
+               goto st_accel_power_off;
 
        return 0;
+
+st_accel_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return err;
 }
 
 static int st_accel_spi_remove(struct spi_device *spi)
 {
-       st_accel_common_remove(spi_get_drvdata(spi));
+       struct iio_dev *indio_dev = spi_get_drvdata(spi);
+
+       st_sensors_power_disable(indio_dev);
+
+       st_accel_common_remove(indio_dev);
 
        return 0;
 }
index e000504e1df494d92ee5d33f571e74a92aea6e8a..ee3f0ea96ac543fd933f54a85031e39f32c506fa 100644 (file)
@@ -471,13 +471,9 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &gyro_info;
 
-       err = st_sensors_power_enable(indio_dev);
-       if (err)
-               return err;
-
        err = st_sensors_verify_id(indio_dev);
        if (err < 0)
-               goto st_gyro_power_off;
+               return err;
 
        gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS;
        indio_dev->channels = gdata->sensor_settings->ch;
@@ -490,11 +486,11 @@ int st_gyro_common_probe(struct iio_dev *indio_dev)
 
        err = st_sensors_init_sensor(indio_dev, pdata);
        if (err < 0)
-               goto st_gyro_power_off;
+               return err;
 
        err = st_gyro_allocate_ring(indio_dev);
        if (err < 0)
-               goto st_gyro_power_off;
+               return err;
 
        if (gdata->irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
@@ -517,9 +513,6 @@ st_gyro_device_register_error:
                st_sensors_deallocate_trigger(indio_dev);
 st_gyro_probe_trigger_error:
        st_gyro_deallocate_ring(indio_dev);
-st_gyro_power_off:
-       st_sensors_power_disable(indio_dev);
-
        return err;
 }
 EXPORT_SYMBOL(st_gyro_common_probe);
@@ -528,8 +521,6 @@ void st_gyro_common_remove(struct iio_dev *indio_dev)
 {
        struct st_sensor_data *gdata = iio_priv(indio_dev);
 
-       st_sensors_power_disable(indio_dev);
-
        iio_device_unregister(indio_dev);
        if (gdata->irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
index 8190966e6ff0aa77f24ef8ac1d5da2a0b24b1034..a25cc0379e16313cf24790cefcc6614f5b1f3974 100644 (file)
@@ -86,16 +86,29 @@ static int st_gyro_i2c_probe(struct i2c_client *client,
        if (err < 0)
                return err;
 
+       err = st_sensors_power_enable(indio_dev);
+       if (err)
+               return err;
+
        err = st_gyro_common_probe(indio_dev);
        if (err < 0)
-               return err;
+               goto st_gyro_power_off;
 
        return 0;
+
+st_gyro_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return err;
 }
 
 static int st_gyro_i2c_remove(struct i2c_client *client)
 {
-       st_gyro_common_remove(i2c_get_clientdata(client));
+       struct iio_dev *indio_dev = i2c_get_clientdata(client);
+
+       st_sensors_power_disable(indio_dev);
+
+       st_gyro_common_remove(indio_dev);
 
        return 0;
 }
index efb862763ca3d7b790de1b028e4b6243760ebd8f..18d6a2aeda45a6d0868d62f4f32dfdb05f9cf0c1 100644 (file)
@@ -90,16 +90,29 @@ static int st_gyro_spi_probe(struct spi_device *spi)
        if (err < 0)
                return err;
 
+       err = st_sensors_power_enable(indio_dev);
+       if (err)
+               return err;
+
        err = st_gyro_common_probe(indio_dev);
        if (err < 0)
-               return err;
+               goto st_gyro_power_off;
 
        return 0;
+
+st_gyro_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return err;
 }
 
 static int st_gyro_spi_remove(struct spi_device *spi)
 {
-       st_gyro_common_remove(spi_get_drvdata(spi));
+       struct iio_dev *indio_dev = spi_get_drvdata(spi);
+
+       st_sensors_power_disable(indio_dev);
+
+       st_gyro_common_remove(indio_dev);
 
        return 0;
 }
index 55357f266b8b95535c4457dd37b4204aea3c75d9..58da48434a25688bfeb3ed7a89dbbdffbe17bcae 100644 (file)
@@ -501,13 +501,9 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &magn_info;
 
-       err = st_sensors_power_enable(indio_dev);
-       if (err)
-               return err;
-
        err = st_sensors_verify_id(indio_dev);
        if (err < 0)
-               goto st_magn_power_off;
+               return err;
 
        mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS;
        indio_dev->channels = mdata->sensor_settings->ch;
@@ -521,11 +517,11 @@ int st_magn_common_probe(struct iio_dev *indio_dev)
 
        err = st_sensors_init_sensor(indio_dev, pdata);
        if (err < 0)
-               goto st_magn_power_off;
+               return err;
 
        err = st_magn_allocate_ring(indio_dev);
        if (err < 0)
-               goto st_magn_power_off;
+               return err;
 
        if (mdata->irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
@@ -548,9 +544,6 @@ st_magn_device_register_error:
                st_sensors_deallocate_trigger(indio_dev);
 st_magn_probe_trigger_error:
        st_magn_deallocate_ring(indio_dev);
-st_magn_power_off:
-       st_sensors_power_disable(indio_dev);
-
        return err;
 }
 EXPORT_SYMBOL(st_magn_common_probe);
@@ -559,8 +552,6 @@ void st_magn_common_remove(struct iio_dev *indio_dev)
 {
        struct st_sensor_data *mdata = iio_priv(indio_dev);
 
-       st_sensors_power_disable(indio_dev);
-
        iio_device_unregister(indio_dev);
        if (mdata->irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
index 36f4e7b53b24ff4fed8418e764a12aa0408a7b2c..3e23c117de8e1ef4cc342b1274dbed872af6707f 100644 (file)
@@ -82,16 +82,28 @@ static int st_magn_i2c_probe(struct i2c_client *client,
        if (err < 0)
                return err;
 
+       err = st_sensors_power_enable(indio_dev);
+       if (err)
+               return err;
+
        err = st_magn_common_probe(indio_dev);
        if (err < 0)
-               return err;
+               goto st_magn_power_off;
 
        return 0;
+
+st_magn_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return err;
 }
 
 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);
 
        return 0;
index 0e2323dfc68751857c185e4a366c913f323bca62..03c0a737aba6e72c7311a4ffeb6815f861baa3d6 100644 (file)
@@ -76,16 +76,28 @@ static int st_magn_spi_probe(struct spi_device *spi)
        if (err < 0)
                return err;
 
+       err = st_sensors_power_enable(indio_dev);
+       if (err)
+               return err;
+
        err = st_magn_common_probe(indio_dev);
        if (err < 0)
-               return err;
+               goto st_magn_power_off;
 
        return 0;
+
+st_magn_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return err;
 }
 
 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);
 
        return 0;
index 789a2928504a729c73dd1f2d26a06756909cd7ef..7912b5a6839555ed8e7bca80e7776bb126f46699 100644 (file)
@@ -689,13 +689,9 @@ int st_press_common_probe(struct iio_dev *indio_dev)
        indio_dev->modes = INDIO_DIRECT_MODE;
        indio_dev->info = &press_info;
 
-       err = st_sensors_power_enable(indio_dev);
-       if (err)
-               return err;
-
        err = st_sensors_verify_id(indio_dev);
        if (err < 0)
-               goto st_press_power_off;
+               return err;
 
        /*
         * Skip timestamping channel while declaring available channels to
@@ -718,11 +714,11 @@ int st_press_common_probe(struct iio_dev *indio_dev)
 
        err = st_sensors_init_sensor(indio_dev, pdata);
        if (err < 0)
-               goto st_press_power_off;
+               return err;
 
        err = st_press_allocate_ring(indio_dev);
        if (err < 0)
-               goto st_press_power_off;
+               return err;
 
        if (press_data->irq > 0) {
                err = st_sensors_allocate_trigger(indio_dev,
@@ -745,9 +741,6 @@ st_press_device_register_error:
                st_sensors_deallocate_trigger(indio_dev);
 st_press_probe_trigger_error:
        st_press_deallocate_ring(indio_dev);
-st_press_power_off:
-       st_sensors_power_disable(indio_dev);
-
        return err;
 }
 EXPORT_SYMBOL(st_press_common_probe);
@@ -756,8 +749,6 @@ void st_press_common_remove(struct iio_dev *indio_dev)
 {
        struct st_sensor_data *press_data = iio_priv(indio_dev);
 
-       st_sensors_power_disable(indio_dev);
-
        iio_device_unregister(indio_dev);
        if (press_data->irq > 0)
                st_sensors_deallocate_trigger(indio_dev);
index 09c6903f99b872111296ff7f3c5bc88bc314149a..f0a5af314ceb8e49bb7485220ec895c7ebd9f656 100644 (file)
@@ -98,16 +98,29 @@ static int st_press_i2c_probe(struct i2c_client *client,
        if (ret < 0)
                return ret;
 
+       ret = st_sensors_power_enable(indio_dev);
+       if (ret)
+               return ret;
+
        ret = st_press_common_probe(indio_dev);
        if (ret < 0)
-               return ret;
+               goto st_press_power_off;
 
        return 0;
+
+st_press_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return ret;
 }
 
 static int st_press_i2c_remove(struct i2c_client *client)
 {
-       st_press_common_remove(i2c_get_clientdata(client));
+       struct iio_dev *indio_dev = i2c_get_clientdata(client);
+
+       st_sensors_power_disable(indio_dev);
+
+       st_press_common_remove(indio_dev);
 
        return 0;
 }
index b5ee3ec2764ff0b4dd19ecb0ea2807d986ab63fa..b48cf7d01cd74bef16f603ba4ea618d27b3750ba 100644 (file)
@@ -82,16 +82,29 @@ static int st_press_spi_probe(struct spi_device *spi)
        if (err < 0)
                return err;
 
+       err = st_sensors_power_enable(indio_dev);
+       if (err)
+               return err;
+
        err = st_press_common_probe(indio_dev);
        if (err < 0)
-               return err;
+               goto st_press_power_off;
 
        return 0;
+
+st_press_power_off:
+       st_sensors_power_disable(indio_dev);
+
+       return err;
 }
 
 static int st_press_spi_remove(struct spi_device *spi)
 {
-       st_press_common_remove(spi_get_drvdata(spi));
+       struct iio_dev *indio_dev = spi_get_drvdata(spi);
+
+       st_sensors_power_disable(indio_dev);
+
+       st_press_common_remove(indio_dev);
 
        return 0;
 }