Commit 7bb8a0cf authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Bartosz Golaszewski

gpio: adp5588: Remove support for platform setup and teardown callbacks

If the teardown callback failed in the gpio driver, it fails to free the
irq (if there is one). The device is removed anyhow. If later on the irq
triggers, all sorts of unpleasant things might happen (e.g. accessing
the struct adp5588_gpio which is already freed in the meantime or starting
i2c bus transfers for an unregistered device). Even before irq support was
added to this driver, exiting early was wrong; back then it failed to
unregister the gpiochip.

Fortunately these callbacks aren't used any more since at least blackfin
was removed in 2018. So just drop them.

Note that they are not removed from struct adp5588_gpio_platform_data
because the keyboard driver adp5588-keys.c also makes use of them.
(I didn't check if the callbacks might have been called twice, maybe there
is another reason hidden to better not call these functions.)

This patch is a preparation for making i2c remove callbacks return void.

Fixes: 80884094 ("gpio: adp5588-gpio: new driver for ADP5588 GPIO expanders")
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarMichael Hennerich <michael.hennerich@analog.com>
Signed-off-by: default avatarBartosz Golaszewski <brgl@bgdev.pl>
parent 43624eda
...@@ -406,12 +406,6 @@ static int adp5588_gpio_probe(struct i2c_client *client) ...@@ -406,12 +406,6 @@ static int adp5588_gpio_probe(struct i2c_client *client)
if (ret) if (ret)
return ret; return ret;
if (pdata && pdata->setup) {
ret = pdata->setup(client, gc->base, gc->ngpio, pdata->context);
if (ret < 0)
dev_warn(&client->dev, "setup failed, %d\n", ret);
}
i2c_set_clientdata(client, dev); i2c_set_clientdata(client, dev);
return 0; return 0;
...@@ -419,20 +413,7 @@ static int adp5588_gpio_probe(struct i2c_client *client) ...@@ -419,20 +413,7 @@ static int adp5588_gpio_probe(struct i2c_client *client)
static int adp5588_gpio_remove(struct i2c_client *client) static int adp5588_gpio_remove(struct i2c_client *client)
{ {
struct adp5588_gpio_platform_data *pdata =
dev_get_platdata(&client->dev);
struct adp5588_gpio *dev = i2c_get_clientdata(client); struct adp5588_gpio *dev = i2c_get_clientdata(client);
int ret;
if (pdata && pdata->teardown) {
ret = pdata->teardown(client,
dev->gpio_chip.base, dev->gpio_chip.ngpio,
pdata->context);
if (ret < 0) {
dev_err(&client->dev, "teardown failed %d\n", ret);
return ret;
}
}
if (dev->client->irq) if (dev->client->irq)
free_irq(dev->client->irq, dev); free_irq(dev->client->irq, dev);
......
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