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;
        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,
 
        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,
                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);
 {
        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);
 
        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;
 }
 
        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;
 }
 
        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;
 
        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,
                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);
 {
        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);
 
        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;
 }
 
        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;
 }
 
        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;
 
        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,
                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);
 {
        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);
 
        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;
 
        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;
 
        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
 
        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,
                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);
 {
        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);
 
        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;
 }
 
        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;
 }