forked from Minki/linux
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: Andi Shyti <andi@etezian.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
f8c5938f69
commit
fbe6a536cf
@ -417,8 +417,10 @@ out:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void ad7877_disable(struct ad7877 *ts)
|
||||
static void ad7877_disable(void *data)
|
||||
{
|
||||
struct ad7877 *ts = data;
|
||||
|
||||
mutex_lock(&ts->mutex);
|
||||
|
||||
if (!ts->disabled) {
|
||||
@ -707,12 +709,17 @@ static int ad7877_probe(struct spi_device *spi)
|
||||
return err;
|
||||
}
|
||||
|
||||
ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!ts || !input_dev) {
|
||||
err = -ENOMEM;
|
||||
goto err_free_mem;
|
||||
}
|
||||
ts = devm_kzalloc(&spi->dev, sizeof(struct ad7877), GFP_KERNEL);
|
||||
if (!ts)
|
||||
return -ENOMEM;
|
||||
|
||||
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);
|
||||
ts->spi = spi;
|
||||
@ -761,11 +768,10 @@ static int ad7877_probe(struct spi_device *spi)
|
||||
|
||||
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_name(&spi->dev), input_dev->name);
|
||||
err = -ENODEV;
|
||||
goto err_free_mem;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (gpio3)
|
||||
@ -775,47 +781,21 @@ static int ad7877_probe(struct spi_device *spi)
|
||||
|
||||
/* Request AD7877 /DAV GPIO interrupt */
|
||||
|
||||
err = request_threaded_irq(spi->irq, NULL, ad7877_irq,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
spi->dev.driver->name, ts);
|
||||
err = devm_request_threaded_irq(&spi->dev, spi->irq, NULL, ad7877_irq,
|
||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||
spi->dev.driver->name, ts);
|
||||
if (err) {
|
||||
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)
|
||||
goto err_free_irq;
|
||||
return err;
|
||||
|
||||
err = input_register_device(input_dev);
|
||||
if (err)
|
||||
goto err_remove_attr_group;
|
||||
|
||||
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 err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -846,7 +826,6 @@ static struct spi_driver ad7877_driver = {
|
||||
.pm = &ad7877_pm,
|
||||
},
|
||||
.probe = ad7877_probe,
|
||||
.remove = ad7877_remove,
|
||||
};
|
||||
|
||||
module_spi_driver(ad7877_driver);
|
||||
|
Loading…
Reference in New Issue
Block a user