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

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
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -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,
};

+0 −10
Original line number Diff line number Diff line
@@ -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);
+21 −39
Original line number Diff line number Diff line
@@ -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,
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,35 +654,23 @@ 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);

	err = devm_add_action_or_reset(dev, ad7879_cleanup_sysfs, ts);
	if (err)
		return ERR_PTR(err);

	if (pdata) {
	err = ad7879_gpio_add(ts, pdata);
	if (err)
			goto err_remove_attr;
	}
		return ERR_PTR(err);

	err = input_register_device(input_dev);
	if (err)
		goto err_remove_gpio;

	return ts;

err_remove_gpio:
	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);

void ad7879_remove(struct ad7879 *ts)
{
	ad7879_gpio_remove(ts);
	sysfs_remove_group(&ts->dev->kobj, &ad7879_attr_group);
	return 0;
}
EXPORT_SYMBOL(ad7879_remove);
EXPORT_SYMBOL(ad7879_probe);

MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver");
+0 −1
Original line number Diff line number Diff line
@@ -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