iio: pressure: bmp280: use devm action and remove labels from probe
authorBartosz Golaszewski <bgolaszewski@baylibre.com>
Mon, 7 Oct 2019 02:41:31 +0000 (04:41 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 22 Oct 2019 10:10:23 +0000 (11:10 +0100)
We can drop some duplicate code if we use devm_action for disabling
regulators and pm and the managed variant of iio_device_register().

This allows us to completely remove all remove() callbacks from both
i2c and spi code.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/pressure/bmp280-core.c
drivers/iio/pressure/bmp280-i2c.c
drivers/iio/pressure/bmp280-spi.c
drivers/iio/pressure/bmp280.h

index bf39ffb..29c209c 100644 (file)
@@ -986,6 +986,22 @@ static int bmp085_fetch_eoc_irq(struct device *dev,
        return 0;
 }
 
+static void bmp280_pm_disable(void *data)
+{
+       struct device *dev = data;
+
+       pm_runtime_get_sync(dev);
+       pm_runtime_put_noidle(dev);
+       pm_runtime_disable(dev);
+}
+
+static void bmp280_regulators_disable(void *data)
+{
+       struct regulator_bulk_data *supplies = data;
+
+       regulator_bulk_disable(BMP280_NUM_SUPPLIES, supplies);
+}
+
 int bmp280_common_probe(struct device *dev,
                        struct regmap *regmap,
                        unsigned int chip,
@@ -1057,6 +1073,11 @@ int bmp280_common_probe(struct device *dev,
                return ret;
        }
 
+       ret = devm_add_action_or_reset(dev, bmp280_regulators_disable,
+                                      data->supplies);
+       if (ret)
+               return ret;
+
        /* Wait to make sure we started up properly */
        usleep_range(data->start_up_time, data->start_up_time + 100);
 
@@ -1071,17 +1092,16 @@ int bmp280_common_probe(struct device *dev,
        data->regmap = regmap;
        ret = regmap_read(regmap, BMP280_REG_ID, &chip_id);
        if (ret < 0)
-               goto out_disable_regulators;
+               return ret;
        if (chip_id != chip) {
                dev_err(dev, "bad chip id: expected %x got %x\n",
                        chip, chip_id);
-               ret = -EINVAL;
-               goto out_disable_regulators;
+               return -EINVAL;
        }
 
        ret = data->chip_info->chip_config(data);
        if (ret < 0)
-               goto out_disable_regulators;
+               return ret;
 
        dev_set_drvdata(dev, indio_dev);
 
@@ -1095,14 +1115,14 @@ int bmp280_common_probe(struct device *dev,
                if (ret < 0) {
                        dev_err(data->dev,
                                "failed to read calibration coefficients\n");
-                       goto out_disable_regulators;
+                       return ret;
                }
        } else if (chip_id == BMP280_CHIP_ID || chip_id == BME280_CHIP_ID) {
                ret = bmp280_read_calib(data, &data->calib.bmp280, chip_id);
                if (ret < 0) {
                        dev_err(data->dev,
                                "failed to read calibration coefficients\n");
-                       goto out_disable_regulators;
+                       return ret;
                }
        }
 
@@ -1114,7 +1134,7 @@ int bmp280_common_probe(struct device *dev,
        if (irq > 0 || (chip_id  == BMP180_CHIP_ID)) {
                ret = bmp085_fetch_eoc_irq(dev, name, irq, data);
                if (ret)
-                       goto out_disable_regulators;
+                       return ret;
        }
 
        /* Enable runtime PM */
@@ -1129,36 +1149,14 @@ int bmp280_common_probe(struct device *dev,
        pm_runtime_use_autosuspend(dev);
        pm_runtime_put(dev);
 
-       ret = iio_device_register(indio_dev);
+       ret = devm_add_action_or_reset(dev, bmp280_pm_disable, dev);
        if (ret)
-               goto out_runtime_pm_disable;
-
-       return 0;
+               return ret;
 
-out_runtime_pm_disable:
-       pm_runtime_get_sync(data->dev);
-       pm_runtime_put_noidle(data->dev);
-       pm_runtime_disable(data->dev);
-out_disable_regulators:
-       regulator_bulk_disable(BMP280_NUM_SUPPLIES, data->supplies);
-       return ret;
+       return devm_iio_device_register(dev, indio_dev);
 }
 EXPORT_SYMBOL(bmp280_common_probe);
 
-int bmp280_common_remove(struct device *dev)
-{
-       struct iio_dev *indio_dev = dev_get_drvdata(dev);
-       struct bmp280_data *data = iio_priv(indio_dev);
-
-       iio_device_unregister(indio_dev);
-       pm_runtime_get_sync(data->dev);
-       pm_runtime_put_noidle(data->dev);
-       pm_runtime_disable(data->dev);
-       regulator_bulk_disable(BMP280_NUM_SUPPLIES, data->supplies);
-       return 0;
-}
-EXPORT_SYMBOL(bmp280_common_remove);
-
 #ifdef CONFIG_PM
 static int bmp280_runtime_suspend(struct device *dev)
 {
index acd9a37..3109c8e 100644 (file)
@@ -38,11 +38,6 @@ static int bmp280_i2c_probe(struct i2c_client *client,
                                   client->irq);
 }
 
-static int bmp280_i2c_remove(struct i2c_client *client)
-{
-       return bmp280_common_remove(&client->dev);
-}
-
 static const struct acpi_device_id bmp280_acpi_i2c_match[] = {
        {"BMP0280", BMP280_CHIP_ID },
        {"BMP0180", BMP180_CHIP_ID },
@@ -82,7 +77,6 @@ static struct i2c_driver bmp280_i2c_driver = {
                .pm = &bmp280_dev_pm_ops,
        },
        .probe          = bmp280_i2c_probe,
-       .remove         = bmp280_i2c_remove,
        .id_table       = bmp280_i2c_id,
 };
 module_i2c_driver(bmp280_i2c_driver);
index 9d57b7a..625b868 100644 (file)
@@ -86,11 +86,6 @@ static int bmp280_spi_probe(struct spi_device *spi)
                                   spi->irq);
 }
 
-static int bmp280_spi_remove(struct spi_device *spi)
-{
-       return bmp280_common_remove(&spi->dev);
-}
-
 static const struct of_device_id bmp280_of_spi_match[] = {
        { .compatible = "bosch,bmp085", },
        { .compatible = "bosch,bmp180", },
@@ -118,7 +113,6 @@ static struct spi_driver bmp280_spi_driver = {
        },
        .id_table = bmp280_spi_id,
        .probe = bmp280_spi_probe,
-       .remove = bmp280_spi_remove,
 };
 module_spi_driver(bmp280_spi_driver);
 
index eda50ef..57ba0e8 100644 (file)
@@ -112,7 +112,6 @@ int bmp280_common_probe(struct device *dev,
                        unsigned int chip,
                        const char *name,
                        int irq);
-int bmp280_common_remove(struct device *dev);
 
 /* PM ops */
 extern const struct dev_pm_ops bmp280_dev_pm_ops;