Commit fbe6a536 authored by Andi Shyti's avatar Andi Shyti Committed by Dmitry Torokhov

Input: ad7877 - use managed resource allocations

Use managed resource allocations to simplify error handling during
probing failure and module exiting.

With this all the goto labels in the probe function together with
the cleanups in the remove function are unnecessary, therefore
removed.
Signed-off-by: default avatarAndi Shyti <andi@etezian.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent f8c5938f
...@@ -417,8 +417,10 @@ static irqreturn_t ad7877_irq(int irq, void *handle) ...@@ -417,8 +417,10 @@ static irqreturn_t ad7877_irq(int irq, void *handle)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void ad7877_disable(struct ad7877 *ts) static void ad7877_disable(void *data)
{ {
struct ad7877 *ts = data;
mutex_lock(&ts->mutex); mutex_lock(&ts->mutex);
if (!ts->disabled) { if (!ts->disabled) {
...@@ -707,12 +709,17 @@ static int ad7877_probe(struct spi_device *spi) ...@@ -707,12 +709,17 @@ static int ad7877_probe(struct spi_device *spi)
return err; return err;
} }
ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL); ts = devm_kzalloc(&spi->dev, sizeof(struct ad7877), GFP_KERNEL);
input_dev = input_allocate_device(); if (!ts)
if (!ts || !input_dev) { return -ENOMEM;
err = -ENOMEM;
goto err_free_mem; input_dev = devm_input_allocate_device(&spi->dev);
} if (!input_dev)
return -ENOMEM;
err = devm_add_action_or_reset(&spi->dev, ad7877_disable, ts);
if (err)
return err;
spi_set_drvdata(spi, ts); spi_set_drvdata(spi, ts);
ts->spi = spi; ts->spi = spi;
...@@ -761,11 +768,10 @@ static int ad7877_probe(struct spi_device *spi) ...@@ -761,11 +768,10 @@ static int ad7877_probe(struct spi_device *spi)
verify = ad7877_read(spi, AD7877_REG_SEQ1); verify = ad7877_read(spi, AD7877_REG_SEQ1);
if (verify != AD7877_MM_SEQUENCE){ if (verify != AD7877_MM_SEQUENCE) {
dev_err(&spi->dev, "%s: Failed to probe %s\n", dev_err(&spi->dev, "%s: Failed to probe %s\n",
dev_name(&spi->dev), input_dev->name); dev_name(&spi->dev), input_dev->name);
err = -ENODEV; return -ENODEV;
goto err_free_mem;
} }
if (gpio3) if (gpio3)
...@@ -775,47 +781,21 @@ static int ad7877_probe(struct spi_device *spi) ...@@ -775,47 +781,21 @@ static int ad7877_probe(struct spi_device *spi)
/* Request AD7877 /DAV GPIO interrupt */ /* Request AD7877 /DAV GPIO interrupt */
err = request_threaded_irq(spi->irq, NULL, ad7877_irq, err = devm_request_threaded_irq(&spi->dev, spi->irq, NULL, ad7877_irq,
IRQF_TRIGGER_FALLING | IRQF_ONESHOT, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
spi->dev.driver->name, ts); spi->dev.driver->name, ts);
if (err) { if (err) {
dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
goto err_free_mem; return err;
} }
err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group); err = devm_device_add_group(&spi->dev, &ad7877_attr_group);
if (err) if (err)
goto err_free_irq; return err;
err = input_register_device(input_dev); err = input_register_device(input_dev);
if (err) if (err)
goto err_remove_attr_group; return err;
return 0;
err_remove_attr_group:
sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);
err_free_irq:
free_irq(spi->irq, ts);
err_free_mem:
input_free_device(input_dev);
kfree(ts);
return err;
}
static int ad7877_remove(struct spi_device *spi)
{
struct ad7877 *ts = spi_get_drvdata(spi);
sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group);
ad7877_disable(ts);
free_irq(ts->spi->irq, ts);
input_unregister_device(ts->input);
kfree(ts);
dev_dbg(&spi->dev, "unregistered touchscreen\n");
return 0; return 0;
} }
...@@ -846,7 +826,6 @@ static struct spi_driver ad7877_driver = { ...@@ -846,7 +826,6 @@ static struct spi_driver ad7877_driver = {
.pm = &ad7877_pm, .pm = &ad7877_pm,
}, },
.probe = ad7877_probe, .probe = ad7877_probe,
.remove = ad7877_remove,
}; };
module_spi_driver(ad7877_driver); module_spi_driver(ad7877_driver);
......
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