{
        struct st_sensor_data *adata = iio_priv(indio_dev);
        struct st_sensors_platform_data *pdata = dev_get_platdata(adata->dev);
+       struct device *parent = indio_dev->dev.parent;
        int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
                        return err;
        }
 
-       return iio_device_register(indio_dev);
+       return devm_iio_device_register(parent, indio_dev);
 }
 EXPORT_SYMBOL(st_accel_common_probe);
 
-void st_accel_common_remove(struct iio_dev *indio_dev)
-{
-       iio_device_unregister(indio_dev);
-}
-EXPORT_SYMBOL(st_accel_common_remove);
-
 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
 MODULE_LICENSE("GPL v2");
 
        return st_accel_common_probe(indio_dev);
 }
 
-static int st_accel_i2c_remove(struct i2c_client *client)
-{
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-       st_accel_common_remove(indio_dev);
-
-       return 0;
-}
-
 static struct i2c_driver st_accel_driver = {
        .driver = {
                .name = "st-accel-i2c",
                .acpi_match_table = ACPI_PTR(st_accel_acpi_match),
        },
        .probe_new = st_accel_i2c_probe,
-       .remove = st_accel_i2c_remove,
        .id_table = st_accel_id_table,
 };
 module_i2c_driver(st_accel_driver);
 
        return st_accel_common_probe(indio_dev);
 }
 
-static int st_accel_spi_remove(struct spi_device *spi)
-{
-       struct iio_dev *indio_dev = spi_get_drvdata(spi);
-
-       st_accel_common_remove(indio_dev);
-
-       return 0;
-}
-
 static const struct spi_device_id st_accel_id_table[] = {
        { LIS3DH_ACCEL_DEV_NAME },
        { LSM330D_ACCEL_DEV_NAME },
                .of_match_table = st_accel_of_match,
        },
        .probe = st_accel_spi_probe,
-       .remove = st_accel_spi_remove,
        .id_table = st_accel_id_table,
 };
 module_spi_driver(st_accel_driver);
 
 {
        struct st_sensor_data *gdata = iio_priv(indio_dev);
        struct st_sensors_platform_data *pdata;
+       struct device *parent = indio_dev->dev.parent;
        int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
                        return err;
        }
 
-       return iio_device_register(indio_dev);
+       return devm_iio_device_register(parent, indio_dev);
 }
 EXPORT_SYMBOL(st_gyro_common_probe);
 
-void st_gyro_common_remove(struct iio_dev *indio_dev)
-{
-       iio_device_unregister(indio_dev);
-}
-EXPORT_SYMBOL(st_gyro_common_remove);
-
 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
 MODULE_DESCRIPTION("STMicroelectronics gyroscopes driver");
 MODULE_LICENSE("GPL v2");
 
        return st_gyro_common_probe(indio_dev);
 }
 
-static int st_gyro_i2c_remove(struct i2c_client *client)
-{
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-       st_gyro_common_remove(indio_dev);
-
-       return 0;
-}
-
 static const struct i2c_device_id st_gyro_id_table[] = {
        { L3G4200D_GYRO_DEV_NAME },
        { LSM330D_GYRO_DEV_NAME },
                .of_match_table = st_gyro_of_match,
        },
        .probe = st_gyro_i2c_probe,
-       .remove = st_gyro_i2c_remove,
        .id_table = st_gyro_id_table,
 };
 module_i2c_driver(st_gyro_driver);
 
        return st_gyro_common_probe(indio_dev);
 }
 
-static int st_gyro_spi_remove(struct spi_device *spi)
-{
-       struct iio_dev *indio_dev = spi_get_drvdata(spi);
-
-       st_gyro_common_remove(indio_dev);
-
-       return 0;
-}
-
 static const struct spi_device_id st_gyro_id_table[] = {
        { L3G4200D_GYRO_DEV_NAME },
        { LSM330D_GYRO_DEV_NAME },
                .of_match_table = st_gyro_of_match,
        },
        .probe = st_gyro_spi_probe,
-       .remove = st_gyro_spi_remove,
        .id_table = st_gyro_id_table,
 };
 module_spi_driver(st_gyro_driver);
 
 };
 
 int st_lsm9ds0_probe(struct st_lsm9ds0 *lsm9ds0, struct regmap *regmap);
-int st_lsm9ds0_remove(struct st_lsm9ds0 *lsm9ds0);
 
 #endif /* ST_LSM9DS0_H */
 
                return ret;
 
        /* Setup magnetometer device */
-       ret = st_lsm9ds0_probe_magn(lsm9ds0, regmap);
-       if (ret)
-               st_accel_common_remove(lsm9ds0->accel);
-
-       return ret;
+       return st_lsm9ds0_probe_magn(lsm9ds0, regmap);
 }
 EXPORT_SYMBOL_GPL(st_lsm9ds0_probe);
 
-int st_lsm9ds0_remove(struct st_lsm9ds0 *lsm9ds0)
-{
-       st_magn_common_remove(lsm9ds0->magn);
-       st_accel_common_remove(lsm9ds0->accel);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(st_lsm9ds0_remove);
-
 MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
 MODULE_DESCRIPTION("STMicroelectronics LSM9DS0 IMU core driver");
 MODULE_LICENSE("GPL v2");
 
        return st_lsm9ds0_probe(lsm9ds0, regmap);
 }
 
-static int st_lsm9ds0_i2c_remove(struct i2c_client *client)
-{
-       return st_lsm9ds0_remove(i2c_get_clientdata(client));
-}
-
 static struct i2c_driver st_lsm9ds0_driver = {
        .driver = {
                .name = "st-lsm9ds0-i2c",
                .of_match_table = st_lsm9ds0_of_match,
        },
        .probe_new = st_lsm9ds0_i2c_probe,
-       .remove = st_lsm9ds0_i2c_remove,
        .id_table = st_lsm9ds0_id_table,
 };
 module_i2c_driver(st_lsm9ds0_driver);
 
        return st_lsm9ds0_probe(lsm9ds0, regmap);
 }
 
-static int st_lsm9ds0_spi_remove(struct spi_device *spi)
-{
-       return st_lsm9ds0_remove(spi_get_drvdata(spi));
-}
-
 static struct spi_driver st_lsm9ds0_driver = {
        .driver = {
                .name = "st-lsm9ds0-spi",
                .of_match_table = st_lsm9ds0_of_match,
        },
        .probe = st_lsm9ds0_spi_probe,
-       .remove = st_lsm9ds0_spi_remove,
        .id_table = st_lsm9ds0_id_table,
 };
 module_spi_driver(st_lsm9ds0_driver);
 
 {
        struct st_sensor_data *mdata = iio_priv(indio_dev);
        struct st_sensors_platform_data *pdata = dev_get_platdata(mdata->dev);
+       struct device *parent = indio_dev->dev.parent;
        int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
                        return err;
        }
 
-       return iio_device_register(indio_dev);
+       return devm_iio_device_register(parent, indio_dev);
 }
 EXPORT_SYMBOL(st_magn_common_probe);
 
-void st_magn_common_remove(struct iio_dev *indio_dev)
-{
-       iio_device_unregister(indio_dev);
-}
-EXPORT_SYMBOL(st_magn_common_remove);
-
 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
 MODULE_DESCRIPTION("STMicroelectronics magnetometers driver");
 MODULE_LICENSE("GPL v2");
 
        return st_magn_common_probe(indio_dev);
 }
 
-static int st_magn_i2c_remove(struct i2c_client *client)
-{
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-       st_magn_common_remove(indio_dev);
-
-       return 0;
-}
-
 static const struct i2c_device_id st_magn_id_table[] = {
        { LSM303DLH_MAGN_DEV_NAME },
        { LSM303DLHC_MAGN_DEV_NAME },
                .of_match_table = st_magn_of_match,
        },
        .probe = st_magn_i2c_probe,
-       .remove = st_magn_i2c_remove,
        .id_table = st_magn_id_table,
 };
 module_i2c_driver(st_magn_driver);
 
        return st_magn_common_probe(indio_dev);
 }
 
-static int st_magn_spi_remove(struct spi_device *spi)
-{
-       struct iio_dev *indio_dev = spi_get_drvdata(spi);
-
-       st_magn_common_remove(indio_dev);
-
-       return 0;
-}
-
 static const struct spi_device_id st_magn_id_table[] = {
        { LIS3MDL_MAGN_DEV_NAME },
        { LSM303AGR_MAGN_DEV_NAME },
                .of_match_table = st_magn_of_match,
        },
        .probe = st_magn_spi_probe,
-       .remove = st_magn_spi_remove,
        .id_table = st_magn_id_table,
 };
 module_spi_driver(st_magn_driver);
 
 {
        struct st_sensor_data *press_data = iio_priv(indio_dev);
        struct st_sensors_platform_data *pdata = dev_get_platdata(press_data->dev);
+       struct device *parent = indio_dev->dev.parent;
        int err;
 
        indio_dev->modes = INDIO_DIRECT_MODE;
                        return err;
        }
 
-       return iio_device_register(indio_dev);
+       return devm_iio_device_register(parent, indio_dev);
 }
 EXPORT_SYMBOL(st_press_common_probe);
 
-void st_press_common_remove(struct iio_dev *indio_dev)
-{
-       iio_device_unregister(indio_dev);
-}
-EXPORT_SYMBOL(st_press_common_remove);
-
 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
 MODULE_DESCRIPTION("STMicroelectronics pressures driver");
 MODULE_LICENSE("GPL v2");
 
        return st_press_common_probe(indio_dev);
 }
 
-static int st_press_i2c_remove(struct i2c_client *client)
-{
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-       st_press_common_remove(indio_dev);
-
-       return 0;
-}
-
 static struct i2c_driver st_press_driver = {
        .driver = {
                .name = "st-press-i2c",
                .acpi_match_table = ACPI_PTR(st_press_acpi_match),
        },
        .probe = st_press_i2c_probe,
-       .remove = st_press_i2c_remove,
        .id_table = st_press_id_table,
 };
 module_i2c_driver(st_press_driver);
 
        return st_press_common_probe(indio_dev);
 }
 
-static int st_press_spi_remove(struct spi_device *spi)
-{
-       struct iio_dev *indio_dev = spi_get_drvdata(spi);
-
-       st_press_common_remove(indio_dev);
-
-       return 0;
-}
-
 static const struct spi_device_id st_press_id_table[] = {
        { LPS001WP_PRESS_DEV_NAME },
        { LPS25H_PRESS_DEV_NAME },
                .of_match_table = st_press_of_match,
        },
        .probe = st_press_spi_probe,
-       .remove = st_press_spi_remove,
        .id_table = st_press_id_table,
 };
 module_spi_driver(st_press_driver);
 
 /* Accelerometer */
 const struct st_sensor_settings *st_accel_get_settings(const char *name);
 int st_accel_common_probe(struct iio_dev *indio_dev);
-void st_accel_common_remove(struct iio_dev *indio_dev);
 
 /* Gyroscope */
 const struct st_sensor_settings *st_gyro_get_settings(const char *name);
 int st_gyro_common_probe(struct iio_dev *indio_dev);
-void st_gyro_common_remove(struct iio_dev *indio_dev);
 
 /* Magnetometer */
 const struct st_sensor_settings *st_magn_get_settings(const char *name);
 int st_magn_common_probe(struct iio_dev *indio_dev);
-void st_magn_common_remove(struct iio_dev *indio_dev);
 
 /* Pressure */
 const struct st_sensor_settings *st_press_get_settings(const char *name);
 int st_press_common_probe(struct iio_dev *indio_dev);
-void st_press_common_remove(struct iio_dev *indio_dev);
 
 #endif /* ST_SENSORS_H */