Input: wacom_i2c - switch to using managed resources
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 22 Mar 2021 21:55:28 +0000 (14:55 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Thu, 25 Mar 2021 18:14:09 +0000 (11:14 -0700)
This simplifies error unwinding path and allows us to get rid of
remove() method.

Reviewed-by: Alistair Francis <alistair@alistair23.me>
Link: https://lore.kernel.org/r/20210321220043.318239-2-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/wacom_i2c.c

index 609ff84..22826c3 100644 (file)
@@ -145,15 +145,16 @@ static void wacom_i2c_close(struct input_dev *dev)
 }
 
 static int wacom_i2c_probe(struct i2c_client *client,
-                                    const struct i2c_device_id *id)
+                          const struct i2c_device_id *id)
 {
+       struct device *dev = &client->dev;
        struct wacom_i2c *wac_i2c;
        struct input_dev *input;
        struct wacom_features features = { 0 };
        int error;
 
        if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
-               dev_err(&client->dev, "i2c_check_functionality error\n");
+               dev_err(dev, "i2c_check_functionality error\n");
                return -EIO;
        }
 
@@ -161,21 +162,22 @@ static int wacom_i2c_probe(struct i2c_client *client,
        if (error)
                return error;
 
-       wac_i2c = kzalloc(sizeof(*wac_i2c), GFP_KERNEL);
-       input = input_allocate_device();
-       if (!wac_i2c || !input) {
-               error = -ENOMEM;
-               goto err_free_mem;
-       }
+       wac_i2c = devm_kzalloc(dev, sizeof(*wac_i2c), GFP_KERNEL);
+       if (!wac_i2c)
+               return -ENOMEM;
 
        wac_i2c->client = client;
+
+       input = devm_input_allocate_device(dev);
+       if (!input)
+               return -ENOMEM;
+
        wac_i2c->input = input;
 
        input->name = "Wacom I2C Digitizer";
        input->id.bustype = BUS_I2C;
        input->id.vendor = 0x56a;
        input->id.version = features.fw_version;
-       input->dev.parent = &client->dev;
        input->open = wacom_i2c_open;
        input->close = wacom_i2c_close;
 
@@ -194,12 +196,11 @@ static int wacom_i2c_probe(struct i2c_client *client,
 
        input_set_drvdata(input, wac_i2c);
 
-       error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq,
-                                    IRQF_ONESHOT, "wacom_i2c", wac_i2c);
+       error = devm_request_threaded_irq(dev, client->irq, NULL, wacom_i2c_irq,
+                                         IRQF_ONESHOT, "wacom_i2c", wac_i2c);
        if (error) {
-               dev_err(&client->dev,
-                       "Failed to enable IRQ, error: %d\n", error);
-               goto err_free_mem;
+               dev_err(dev, "Failed to request IRQ: %d\n", error);
+               return error;
        }
 
        /* Disable the IRQ, we'll enable it in wac_i2c_open() */
@@ -207,31 +208,10 @@ static int wacom_i2c_probe(struct i2c_client *client,
 
        error = input_register_device(wac_i2c->input);
        if (error) {
-               dev_err(&client->dev,
-                       "Failed to register input device, error: %d\n", error);
-               goto err_free_irq;
+               dev_err(dev, "Failed to register input device: %d\n", error);
+               return error;
        }
 
-       i2c_set_clientdata(client, wac_i2c);
-       return 0;
-
-err_free_irq:
-       free_irq(client->irq, wac_i2c);
-err_free_mem:
-       input_free_device(input);
-       kfree(wac_i2c);
-
-       return error;
-}
-
-static int wacom_i2c_remove(struct i2c_client *client)
-{
-       struct wacom_i2c *wac_i2c = i2c_get_clientdata(client);
-
-       free_irq(client->irq, wac_i2c);
-       input_unregister_device(wac_i2c->input);
-       kfree(wac_i2c);
-
        return 0;
 }
 
@@ -268,7 +248,6 @@ static struct i2c_driver wacom_i2c_driver = {
        },
 
        .probe          = wacom_i2c_probe,
-       .remove         = wacom_i2c_remove,
        .id_table       = wacom_i2c_id,
 };
 module_i2c_driver(wacom_i2c_driver);