]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: mcp2221: switch i2c registration to devm functions
authorMatt Ranostay <matt.ranostay@konsulko.com>
Sat, 1 Oct 2022 00:52:06 +0000 (17:52 -0700)
committerJiri Kosina <jkosina@suse.cz>
Tue, 18 Oct 2022 13:00:01 +0000 (15:00 +0200)
Switch from i2c_add_adapter() to resource managed devm_i2c_add_adapter()
for matching rest of driver initialization, and more concise code.

Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-mcp2221.c

index de52e9f7bb8cbd26cc7ccefec6bcf3128f923bfd..4d10a24e3e130e40275e7220b9a43c52813de047 100644 (file)
@@ -824,6 +824,20 @@ static int mcp2221_raw_event(struct hid_device *hdev,
        return 1;
 }
 
+/* Device resource managed function for HID unregistration */
+static void mcp2221_hid_unregister(void *ptr)
+{
+       struct hid_device *hdev = ptr;
+
+       hid_hw_close(hdev);
+       hid_hw_stop(hdev);
+}
+
+/* This is needed to be sure hid_hw_stop() isn't called twice by the subsystem */
+static void mcp2221_remove(struct hid_device *hdev)
+{
+}
+
 static int mcp2221_probe(struct hid_device *hdev,
                                        const struct hid_device_id *id)
 {
@@ -849,7 +863,8 @@ static int mcp2221_probe(struct hid_device *hdev,
        ret = hid_hw_open(hdev);
        if (ret) {
                hid_err(hdev, "can't open device\n");
-               goto err_hstop;
+               hid_hw_stop(hdev);
+               return ret;
        }
 
        mutex_init(&mcp->lock);
@@ -857,6 +872,10 @@ static int mcp2221_probe(struct hid_device *hdev,
        hid_set_drvdata(hdev, mcp);
        mcp->hdev = hdev;
 
+       ret = devm_add_action_or_reset(&hdev->dev, mcp2221_hid_unregister, hdev);
+       if (ret)
+               return ret;
+
        /* Set I2C bus clock diviser */
        if (i2c_clk_freq > 400)
                i2c_clk_freq = 400;
@@ -873,19 +892,17 @@ static int mcp2221_probe(struct hid_device *hdev,
                        "MCP2221 usb-i2c bridge on hidraw%d",
                        ((struct hidraw *)hdev->hidraw)->minor);
 
-       ret = i2c_add_adapter(&mcp->adapter);
+       ret = devm_i2c_add_adapter(&hdev->dev, &mcp->adapter);
        if (ret) {
                hid_err(hdev, "can't add usb-i2c adapter: %d\n", ret);
-               goto err_i2c;
+               return ret;
        }
        i2c_set_adapdata(&mcp->adapter, mcp);
 
        /* Setup GPIO chip */
        mcp->gc = devm_kzalloc(&hdev->dev, sizeof(*mcp->gc), GFP_KERNEL);
-       if (!mcp->gc) {
-               ret = -ENOMEM;
-               goto err_gc;
-       }
+       if (!mcp->gc)
+               return -ENOMEM;
 
        mcp->gc->label = "mcp2221_gpio";
        mcp->gc->direction_input = mcp_gpio_direction_input;
@@ -900,26 +917,9 @@ static int mcp2221_probe(struct hid_device *hdev,
 
        ret = devm_gpiochip_add_data(&hdev->dev, mcp->gc, mcp);
        if (ret)
-               goto err_gc;
+               return ret;
 
        return 0;
-
-err_gc:
-       i2c_del_adapter(&mcp->adapter);
-err_i2c:
-       hid_hw_close(mcp->hdev);
-err_hstop:
-       hid_hw_stop(mcp->hdev);
-       return ret;
-}
-
-static void mcp2221_remove(struct hid_device *hdev)
-{
-       struct mcp2221 *mcp = hid_get_drvdata(hdev);
-
-       i2c_del_adapter(&mcp->adapter);
-       hid_hw_close(mcp->hdev);
-       hid_hw_stop(mcp->hdev);
 }
 
 static const struct hid_device_id mcp2221_devices[] = {