Input: adxl34x - switch to using managed resources
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 10 Jun 2024 16:42:59 +0000 (09:42 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 11 Jun 2024 18:17:44 +0000 (11:17 -0700)
Switch the driver to use managed resources to simplify error handling.

Link: https://lore.kernel.org/r/20240610164301.1048482-3-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/misc/adxl34x-i2c.c
drivers/input/misc/adxl34x-spi.c
drivers/input/misc/adxl34x.c
drivers/input/misc/adxl34x.h

index 7531c7b..c05d898 100644 (file)
@@ -98,13 +98,6 @@ static int adxl34x_i2c_probe(struct i2c_client *client)
        return 0;
 }
 
-static void adxl34x_i2c_remove(struct i2c_client *client)
-{
-       struct adxl34x *ac = i2c_get_clientdata(client);
-
-       adxl34x_remove(ac);
-}
-
 static const struct i2c_device_id adxl34x_id[] = {
        { "adxl34x" },
        { }
@@ -137,7 +130,6 @@ static struct i2c_driver adxl34x_driver = {
                .of_match_table = adxl34x_of_id,
        },
        .probe    = adxl34x_i2c_probe,
-       .remove   = adxl34x_i2c_remove,
        .id_table = adxl34x_id,
 };
 
index 2befcc4..fd716d8 100644 (file)
@@ -87,13 +87,6 @@ static int adxl34x_spi_probe(struct spi_device *spi)
        return 0;
 }
 
-static void adxl34x_spi_remove(struct spi_device *spi)
-{
-       struct adxl34x *ac = spi_get_drvdata(spi);
-
-       adxl34x_remove(ac);
-}
-
 static struct spi_driver adxl34x_driver = {
        .driver = {
                .name = "adxl34x",
@@ -101,7 +94,6 @@ static struct spi_driver adxl34x_driver = {
                .pm = pm_sleep_ptr(&adxl34x_pm),
        },
        .probe   = adxl34x_spi_probe,
-       .remove  = adxl34x_spi_remove,
 };
 
 module_spi_driver(adxl34x_driver);
index 830acf2..c6c3400 100644 (file)
@@ -707,21 +707,21 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
        struct adxl34x *ac;
        struct input_dev *input_dev;
        const struct adxl34x_platform_data *pdata;
-       int err, range, i;
+       int error, range, i;
        int revid;
 
        if (!irq) {
                dev_err(dev, "no IRQ?\n");
-               err = -ENODEV;
-               goto err_out;
+               return ERR_PTR(-ENODEV);
        }
 
-       ac = kzalloc(sizeof(*ac), GFP_KERNEL);
-       input_dev = input_allocate_device();
-       if (!ac || !input_dev) {
-               err = -ENOMEM;
-               goto err_free_mem;
-       }
+       ac = devm_kzalloc(dev, sizeof(*ac), GFP_KERNEL);
+       if (!ac)
+               return ERR_PTR(-ENOMEM);
+
+       input_dev = devm_input_allocate_device(dev);
+       if (!input_dev)
+               return ERR_PTR(-ENOMEM);
 
        ac->fifo_delay = fifo_delay_default;
 
@@ -754,14 +754,12 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
                break;
        default:
                dev_err(dev, "Failed to probe %s\n", input_dev->name);
-               err = -ENODEV;
-               goto err_free_mem;
+               return ERR_PTR(-ENODEV);
        }
 
        snprintf(ac->phys, sizeof(ac->phys), "%s/input0", dev_name(dev));
 
        input_dev->phys = ac->phys;
-       input_dev->dev.parent = dev;
        input_dev->id.product = ac->model;
        input_dev->id.bustype = bops->bustype;
        input_dev->open = adxl34x_input_open;
@@ -816,16 +814,16 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
 
        AC_WRITE(ac, POWER_CTL, 0);
 
-       err = request_threaded_irq(ac->irq, NULL, adxl34x_irq,
-                                  IRQF_ONESHOT, dev_name(dev), ac);
-       if (err) {
+       error = devm_request_threaded_irq(dev, ac->irq, NULL, adxl34x_irq,
+                                         IRQF_ONESHOT, dev_name(dev), ac);
+       if (error) {
                dev_err(dev, "irq %d busy?\n", ac->irq);
-               goto err_free_mem;
+               return ERR_PTR(error);
        }
 
-       err = input_register_device(input_dev);
-       if (err)
-               goto err_free_irq;
+       error = input_register_device(input_dev);
+       if (error)
+               return ERR_PTR(error);
 
        AC_WRITE(ac, OFSX, pdata->x_axis_offset);
        ac->hwcal.x = pdata->x_axis_offset;
@@ -884,26 +882,9 @@ struct adxl34x *adxl34x_probe(struct device *dev, int irq,
        ac->pdata.power_mode &= (PCTL_AUTO_SLEEP | PCTL_LINK);
 
        return ac;
-
- err_free_irq:
-       free_irq(ac->irq, ac);
- err_free_mem:
-       input_free_device(input_dev);
-       kfree(ac);
- err_out:
-       return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(adxl34x_probe);
 
-void adxl34x_remove(struct adxl34x *ac)
-{
-       free_irq(ac->irq, ac);
-       input_unregister_device(ac->input);
-       dev_dbg(ac->dev, "unregistered accelerometer\n");
-       kfree(ac);
-}
-EXPORT_SYMBOL_GPL(adxl34x_remove);
-
 EXPORT_GPL_SIMPLE_DEV_PM_OPS(adxl34x_pm, adxl34x_suspend, adxl34x_resume);
 
 MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
index 67e0ddc..718e90c 100644 (file)
@@ -23,7 +23,6 @@ struct adxl34x_bus_ops {
 struct adxl34x *adxl34x_probe(struct device *dev, int irq,
                              bool fifo_delay_default,
                              const struct adxl34x_bus_ops *bops);
-void adxl34x_remove(struct adxl34x *ac);
 
 extern const struct dev_pm_ops adxl34x_pm;
 extern const struct attribute_group *adxl34x_groups[];