diff options
author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2016-07-13 18:05:55 +0200 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2016-08-05 13:39:14 +0200 |
commit | 84dfbd7f2a58c8c79ba7947159fc5f2c521348f6 (patch) | |
tree | 22560dce52aef34def9bba0d948c82dc21f6b195 /drivers/hid/wacom_sys.c | |
parent | 3dad188e6a1c6a6213a21dee8b609ceab45d6258 (diff) |
HID: wacom: put the managed resources in a group
We currently have a complex clean_inputs() function while this can be
handled all by devres. Set a group that we can destroy in wireless_work().
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Acked-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/wacom_sys.c')
-rw-r--r-- | drivers/hid/wacom_sys.c | 69 |
1 files changed, 30 insertions, 39 deletions
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index da2fccf5fa15..08f6d1f29c73 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -1394,34 +1394,6 @@ static struct input_dev *wacom_allocate_input(struct wacom *wacom) return input_dev; } -static void wacom_clean_inputs(struct wacom *wacom) -{ - if (wacom->wacom_wac.pen_input) { - if (wacom->wacom_wac.pen_registered) - input_unregister_device(wacom->wacom_wac.pen_input); - else - input_free_device(wacom->wacom_wac.pen_input); - } - if (wacom->wacom_wac.touch_input) { - if (wacom->wacom_wac.touch_registered) - input_unregister_device(wacom->wacom_wac.touch_input); - else - input_free_device(wacom->wacom_wac.touch_input); - } - if (wacom->wacom_wac.pad_input) { - if (wacom->wacom_wac.pad_registered) - input_unregister_device(wacom->wacom_wac.pad_input); - else - input_free_device(wacom->wacom_wac.pad_input); - } - wacom->wacom_wac.pen_input = NULL; - wacom->wacom_wac.touch_input = NULL; - wacom->wacom_wac.pad_input = NULL; - wacom->wacom_wac.pen_registered = false; - wacom->wacom_wac.touch_registered = false; - wacom->wacom_wac.pad_registered = false; -} - static int wacom_allocate_inputs(struct wacom *wacom) { struct wacom_wac *wacom_wac = &(wacom->wacom_wac); @@ -1464,7 +1436,6 @@ static int wacom_register_inputs(struct wacom *wacom) error = input_register_device(pen_input_dev); if (error) goto fail; - wacom_wac->pen_registered = true; } error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac); @@ -1477,7 +1448,6 @@ static int wacom_register_inputs(struct wacom *wacom) error = input_register_device(touch_input_dev); if (error) goto fail; - wacom_wac->touch_registered = true; } error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); @@ -1490,18 +1460,14 @@ static int wacom_register_inputs(struct wacom *wacom) error = input_register_device(pad_input_dev); if (error) goto fail; - wacom_wac->pad_registered = true; } return 0; fail: wacom_wac->pad_input = NULL; - wacom_wac->pad_registered = false; wacom_wac->touch_input = NULL; - wacom_wac->touch_registered = false; wacom_wac->pen_input = NULL; - wacom_wac->pen_registered = false; return error; } @@ -1612,6 +1578,22 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) "%s%s Pad", name, suffix); } +static void wacom_release_resources(struct wacom *wacom) +{ + struct hid_device *hdev = wacom->hdev; + + if (!wacom->resources) + return; + + devres_release_group(&hdev->dev, wacom); + + wacom->resources = false; + + wacom->wacom_wac.pen_input = NULL; + wacom->wacom_wac.touch_input = NULL; + wacom->wacom_wac.pad_input = NULL; +} + static int wacom_parse_and_register(struct wacom *wacom, bool wireless) { struct wacom_wac *wacom_wac = &wacom->wacom_wac; @@ -1624,9 +1606,14 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) if (features->pktlen > WACOM_PKGLEN_MAX) return -EINVAL; + if (!devres_open_group(&hdev->dev, wacom, GFP_KERNEL)) + return -ENOMEM; + + wacom->resources = true; + error = wacom_allocate_inputs(wacom); if (error) - return error; + goto fail_open_group; /* * Bamboo Pad has a generic hid handling for the Pen, and we switch it @@ -1733,6 +1720,8 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) wacom_wac->shared->touch_input = wacom_wac->touch_input; } + devres_close_group(&hdev->dev, wacom); + return 0; fail_quirks: @@ -1748,6 +1737,8 @@ fail_battery: fail_shared_data: fail_parsed: fail_allocate_inputs: +fail_open_group: + wacom_release_resources(wacom); return error; } @@ -1773,14 +1764,14 @@ static void wacom_wireless_work(struct work_struct *work) wacom1 = hid_get_drvdata(hdev1); wacom_wac1 = &(wacom1->wacom_wac); wacom_destroy_leds(wacom1); - wacom_clean_inputs(wacom1); + wacom_release_resources(wacom1); /* Touch interface */ hdev2 = usb_get_intfdata(usbdev->config->interface[2]); wacom2 = hid_get_drvdata(hdev2); wacom_wac2 = &(wacom2->wacom_wac); wacom_destroy_leds(wacom2); - wacom_clean_inputs(wacom2); + wacom_release_resources(wacom2); if (wacom_wac->pid == 0) { hid_info(wacom->hdev, "wireless tablet disconnected\n"); @@ -1835,9 +1826,9 @@ static void wacom_wireless_work(struct work_struct *work) fail: wacom_destroy_leds(wacom1); - wacom_clean_inputs(wacom1); + wacom_release_resources(wacom1); wacom_destroy_leds(wacom2); - wacom_clean_inputs(wacom2); + wacom_release_resources(wacom2); return; } |