Input: ad7879 - use more devm interfaces
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 17 Feb 2017 17:29:40 +0000 (09:29 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 23 Feb 2017 17:21:26 +0000 (09:21 -0800)
gpiochip_add now has a managed version, and we can remove sysfs attribute
group via devm_add_action_or_reset (at least until we have devm version of
sysfs_create_group). This allows us to get rid of ad7879_remove().

Reviewed-by: Michael Hennerich <michael.hennerich@analog.com>
Tested-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/ad7879-i2c.c
drivers/input/touchscreen/ad7879-spi.c
drivers/input/touchscreen/ad7879.c
drivers/input/touchscreen/ad7879.h

index 25aa9b89a6aa2e528f4fa6b52f4b6d91b211ec4e..23e04e9f2dadb2ffb98bf62afbb0209d39795fb3 100644 (file)
@@ -45,17 +45,6 @@ static int ad7879_i2c_probe(struct i2c_client *client,
        if (IS_ERR(ts))
                return PTR_ERR(ts);
 
-       i2c_set_clientdata(client, ts);
-
-       return 0;
-}
-
-static int ad7879_i2c_remove(struct i2c_client *client)
-{
-       struct ad7879 *ts = i2c_get_clientdata(client);
-
-       ad7879_remove(ts);
-
        return 0;
 }
 
@@ -81,7 +70,6 @@ static struct i2c_driver ad7879_i2c_driver = {
                .of_match_table = of_match_ptr(ad7879_i2c_dt_ids),
        },
        .probe          = ad7879_i2c_probe,
-       .remove         = ad7879_i2c_remove,
        .id_table       = ad7879_id,
 };
 
index 8fb8ccdfac6a5a5d897e6cbe6adb4c640a051878..b995891af20dfb6c67d06530d516cc1cdd5557ce 100644 (file)
@@ -62,15 +62,6 @@ static int ad7879_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static int ad7879_spi_remove(struct spi_device *spi)
-{
-       struct ad7879 *ts = spi_get_drvdata(spi);
-
-       ad7879_remove(ts);
-
-       return 0;
-}
-
 #ifdef CONFIG_OF
 static const struct of_device_id ad7879_spi_dt_ids[] = {
        { .compatible = "adi,ad7879", },
@@ -86,7 +77,6 @@ static struct spi_driver ad7879_spi_driver = {
                .of_match_table = of_match_ptr(ad7879_spi_dt_ids),
        },
        .probe          = ad7879_spi_probe,
-       .remove         = ad7879_spi_remove,
 };
 
 module_spi_driver(ad7879_spi_driver);
index 6465db7a1b20e9d7afd835e886ebb6bc567e4540..b7ab7f9767cabca9f3c1f38fdf93046501775b03 100644 (file)
@@ -458,7 +458,7 @@ static int ad7879_gpio_add(struct ad7879 *ts,
 
        mutex_init(&ts->mutex);
 
-       if (pdata->gpio_export) {
+       if (pdata && pdata->gpio_export) {
                ts->gc.direction_input = ad7879_gpio_direction_input;
                ts->gc.direction_output = ad7879_gpio_direction_output;
                ts->gc.get = ad7879_gpio_get_value;
@@ -470,7 +470,7 @@ static int ad7879_gpio_add(struct ad7879 *ts,
                ts->gc.owner = THIS_MODULE;
                ts->gc.parent = ts->dev;
 
-               ret = gpiochip_add_data(&ts->gc, ts);
+               ret = devm_gpiochip_add_data(ts->dev, &ts->gc, ts);
                if (ret)
                        dev_err(ts->dev, "failed to register gpio %d\n",
                                ts->gc.base);
@@ -478,25 +478,12 @@ static int ad7879_gpio_add(struct ad7879 *ts,
 
        return ret;
 }
-
-static void ad7879_gpio_remove(struct ad7879 *ts)
-{
-       const struct ad7879_platform_data *pdata = dev_get_platdata(ts->dev);
-
-       if (pdata && pdata->gpio_export)
-               gpiochip_remove(&ts->gc);
-
-}
 #else
-static inline int ad7879_gpio_add(struct ad7879 *ts,
-                                 const struct ad7879_platform_data *pdata)
+static int ad7879_gpio_add(struct ad7879 *ts,
+                          const struct ad7879_platform_data *pdata)
 {
        return 0;
 }
-
-static inline void ad7879_gpio_remove(struct ad7879 *ts)
-{
-}
 #endif
 
 static int ad7879_parse_dt(struct device *dev, struct ad7879 *ts)
@@ -525,6 +512,13 @@ static int ad7879_parse_dt(struct device *dev, struct ad7879 *ts)
        return 0;
 }
 
+static void ad7879_cleanup_sysfs(void *_ts)
+{
+       struct ad7879 *ts = _ts;
+
+       sysfs_remove_group(&ts->dev->kobj, &ad7879_attr_group);
+}
+
 struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap,
                            int irq, u16 bustype, u8 devid)
 {
@@ -660,36 +654,24 @@ struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap,
 
        err = sysfs_create_group(&dev->kobj, &ad7879_attr_group);
        if (err)
-               goto err_out;
+               return ERR_PTR(err);
 
-       if (pdata) {
-               err = ad7879_gpio_add(ts, pdata);
-               if (err)
-                       goto err_remove_attr;
-       }
+       err = devm_add_action_or_reset(dev, ad7879_cleanup_sysfs, ts);
+       if (err)
+               return ERR_PTR(err);
 
-       err = input_register_device(input_dev);
+       err = ad7879_gpio_add(ts, pdata);
        if (err)
-               goto err_remove_gpio;
+               return ERR_PTR(err);
 
-       return ts;
+       err = input_register_device(input_dev);
+       if (err)
+               return ERR_PTR(err);
 
-err_remove_gpio:
-       ad7879_gpio_remove(ts);
-err_remove_attr:
-       sysfs_remove_group(&dev->kobj, &ad7879_attr_group);
-err_out:
-       return ERR_PTR(err);
+       return 0;
 }
 EXPORT_SYMBOL(ad7879_probe);
 
-void ad7879_remove(struct ad7879 *ts)
-{
-       ad7879_gpio_remove(ts);
-       sysfs_remove_group(&ts->dev->kobj, &ad7879_attr_group);
-}
-EXPORT_SYMBOL(ad7879_remove);
-
 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
 MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver");
 MODULE_LICENSE("GPL");
index 1131f8aa118b833c4a18834c50864d285911eef5..d3d2e9dc31ae5495d78c80f4cd810b7b54ae0f16 100644 (file)
@@ -19,6 +19,5 @@ extern const struct dev_pm_ops ad7879_pm_ops;
 
 struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap,
                            int irq, u16 bustype, u8 devid);
-void ad7879_remove(struct ad7879 *);
 
 #endif