Commit 069b2e2c authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: ad7879 - use more devm interfaces

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: default avatarMichael Hennerich <michael.hennerich@analog.com>
Tested-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent 404a24c3
...@@ -45,17 +45,6 @@ static int ad7879_i2c_probe(struct i2c_client *client, ...@@ -45,17 +45,6 @@ static int ad7879_i2c_probe(struct i2c_client *client,
if (IS_ERR(ts)) if (IS_ERR(ts))
return PTR_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; return 0;
} }
...@@ -81,7 +70,6 @@ static struct i2c_driver ad7879_i2c_driver = { ...@@ -81,7 +70,6 @@ static struct i2c_driver ad7879_i2c_driver = {
.of_match_table = of_match_ptr(ad7879_i2c_dt_ids), .of_match_table = of_match_ptr(ad7879_i2c_dt_ids),
}, },
.probe = ad7879_i2c_probe, .probe = ad7879_i2c_probe,
.remove = ad7879_i2c_remove,
.id_table = ad7879_id, .id_table = ad7879_id,
}; };
......
...@@ -62,15 +62,6 @@ static int ad7879_spi_probe(struct spi_device *spi) ...@@ -62,15 +62,6 @@ static int ad7879_spi_probe(struct spi_device *spi)
return 0; 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 #ifdef CONFIG_OF
static const struct of_device_id ad7879_spi_dt_ids[] = { static const struct of_device_id ad7879_spi_dt_ids[] = {
{ .compatible = "adi,ad7879", }, { .compatible = "adi,ad7879", },
...@@ -86,7 +77,6 @@ static struct spi_driver ad7879_spi_driver = { ...@@ -86,7 +77,6 @@ static struct spi_driver ad7879_spi_driver = {
.of_match_table = of_match_ptr(ad7879_spi_dt_ids), .of_match_table = of_match_ptr(ad7879_spi_dt_ids),
}, },
.probe = ad7879_spi_probe, .probe = ad7879_spi_probe,
.remove = ad7879_spi_remove,
}; };
module_spi_driver(ad7879_spi_driver); module_spi_driver(ad7879_spi_driver);
......
...@@ -458,7 +458,7 @@ static int ad7879_gpio_add(struct ad7879 *ts, ...@@ -458,7 +458,7 @@ static int ad7879_gpio_add(struct ad7879 *ts,
mutex_init(&ts->mutex); mutex_init(&ts->mutex);
if (pdata->gpio_export) { if (pdata && pdata->gpio_export) {
ts->gc.direction_input = ad7879_gpio_direction_input; ts->gc.direction_input = ad7879_gpio_direction_input;
ts->gc.direction_output = ad7879_gpio_direction_output; ts->gc.direction_output = ad7879_gpio_direction_output;
ts->gc.get = ad7879_gpio_get_value; ts->gc.get = ad7879_gpio_get_value;
...@@ -470,7 +470,7 @@ static int ad7879_gpio_add(struct ad7879 *ts, ...@@ -470,7 +470,7 @@ static int ad7879_gpio_add(struct ad7879 *ts,
ts->gc.owner = THIS_MODULE; ts->gc.owner = THIS_MODULE;
ts->gc.parent = ts->dev; ts->gc.parent = ts->dev;
ret = gpiochip_add_data(&ts->gc, ts); ret = devm_gpiochip_add_data(ts->dev, &ts->gc, ts);
if (ret) if (ret)
dev_err(ts->dev, "failed to register gpio %d\n", dev_err(ts->dev, "failed to register gpio %d\n",
ts->gc.base); ts->gc.base);
...@@ -478,25 +478,12 @@ static int ad7879_gpio_add(struct ad7879 *ts, ...@@ -478,25 +478,12 @@ static int ad7879_gpio_add(struct ad7879 *ts,
return ret; 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 #else
static inline int ad7879_gpio_add(struct ad7879 *ts, static int ad7879_gpio_add(struct ad7879 *ts,
const struct ad7879_platform_data *pdata) const struct ad7879_platform_data *pdata)
{ {
return 0; return 0;
} }
static inline void ad7879_gpio_remove(struct ad7879 *ts)
{
}
#endif #endif
static int ad7879_parse_dt(struct device *dev, struct ad7879 *ts) 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) ...@@ -525,6 +512,13 @@ static int ad7879_parse_dt(struct device *dev, struct ad7879 *ts)
return 0; 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, struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap,
int irq, u16 bustype, u8 devid) int irq, u16 bustype, u8 devid)
{ {
...@@ -660,36 +654,24 @@ struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap, ...@@ -660,36 +654,24 @@ struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap,
err = sysfs_create_group(&dev->kobj, &ad7879_attr_group); err = sysfs_create_group(&dev->kobj, &ad7879_attr_group);
if (err) if (err)
goto err_out; return ERR_PTR(err);
if (pdata) { err = devm_add_action_or_reset(dev, ad7879_cleanup_sysfs, ts);
err = ad7879_gpio_add(ts, pdata); if (err)
if (err) return ERR_PTR(err);
goto err_remove_attr;
}
err = input_register_device(input_dev); err = ad7879_gpio_add(ts, pdata);
if (err) 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: return 0;
ad7879_gpio_remove(ts);
err_remove_attr:
sysfs_remove_group(&dev->kobj, &ad7879_attr_group);
err_out:
return ERR_PTR(err);
} }
EXPORT_SYMBOL(ad7879_probe); 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_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver"); MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -19,6 +19,5 @@ extern const struct dev_pm_ops ad7879_pm_ops; ...@@ -19,6 +19,5 @@ extern const struct dev_pm_ops ad7879_pm_ops;
struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap, struct ad7879 *ad7879_probe(struct device *dev, struct regmap *regmap,
int irq, u16 bustype, u8 devid); int irq, u16 bustype, u8 devid);
void ad7879_remove(struct ad7879 *);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment