Commit 84dfbd7f authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Jiri Kosina

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: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Acked-by: default avatarPing Cheng <pingc@wacom.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 3dad188e
...@@ -131,6 +131,7 @@ struct wacom { ...@@ -131,6 +131,7 @@ struct wacom {
struct power_supply_desc ac_desc; struct power_supply_desc ac_desc;
struct kobject *remote_dir; struct kobject *remote_dir;
struct attribute_group remote_group[5]; struct attribute_group remote_group[5];
bool resources;
}; };
static inline void wacom_schedule_work(struct wacom_wac *wacom_wac, static inline void wacom_schedule_work(struct wacom_wac *wacom_wac,
......
...@@ -1394,34 +1394,6 @@ static struct input_dev *wacom_allocate_input(struct wacom *wacom) ...@@ -1394,34 +1394,6 @@ static struct input_dev *wacom_allocate_input(struct wacom *wacom)
return input_dev; 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) static int wacom_allocate_inputs(struct wacom *wacom)
{ {
struct wacom_wac *wacom_wac = &(wacom->wacom_wac); struct wacom_wac *wacom_wac = &(wacom->wacom_wac);
...@@ -1464,7 +1436,6 @@ static int wacom_register_inputs(struct wacom *wacom) ...@@ -1464,7 +1436,6 @@ static int wacom_register_inputs(struct wacom *wacom)
error = input_register_device(pen_input_dev); error = input_register_device(pen_input_dev);
if (error) if (error)
goto fail; goto fail;
wacom_wac->pen_registered = true;
} }
error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac); error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac);
...@@ -1477,7 +1448,6 @@ static int wacom_register_inputs(struct wacom *wacom) ...@@ -1477,7 +1448,6 @@ static int wacom_register_inputs(struct wacom *wacom)
error = input_register_device(touch_input_dev); error = input_register_device(touch_input_dev);
if (error) if (error)
goto fail; goto fail;
wacom_wac->touch_registered = true;
} }
error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac); error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
...@@ -1490,18 +1460,14 @@ static int wacom_register_inputs(struct wacom *wacom) ...@@ -1490,18 +1460,14 @@ static int wacom_register_inputs(struct wacom *wacom)
error = input_register_device(pad_input_dev); error = input_register_device(pad_input_dev);
if (error) if (error)
goto fail; goto fail;
wacom_wac->pad_registered = true;
} }
return 0; return 0;
fail: fail:
wacom_wac->pad_input = NULL; wacom_wac->pad_input = NULL;
wacom_wac->pad_registered = false;
wacom_wac->touch_input = NULL; wacom_wac->touch_input = NULL;
wacom_wac->touch_registered = false;
wacom_wac->pen_input = NULL; wacom_wac->pen_input = NULL;
wacom_wac->pen_registered = false;
return error; return error;
} }
...@@ -1612,6 +1578,22 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) ...@@ -1612,6 +1578,22 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
"%s%s Pad", name, 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) static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
{ {
struct wacom_wac *wacom_wac = &wacom->wacom_wac; struct wacom_wac *wacom_wac = &wacom->wacom_wac;
...@@ -1624,9 +1606,14 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) ...@@ -1624,9 +1606,14 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
if (features->pktlen > WACOM_PKGLEN_MAX) if (features->pktlen > WACOM_PKGLEN_MAX)
return -EINVAL; return -EINVAL;
if (!devres_open_group(&hdev->dev, wacom, GFP_KERNEL))
return -ENOMEM;
wacom->resources = true;
error = wacom_allocate_inputs(wacom); error = wacom_allocate_inputs(wacom);
if (error) if (error)
return error; goto fail_open_group;
/* /*
* Bamboo Pad has a generic hid handling for the Pen, and we switch it * 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) ...@@ -1733,6 +1720,8 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
wacom_wac->shared->touch_input = wacom_wac->touch_input; wacom_wac->shared->touch_input = wacom_wac->touch_input;
} }
devres_close_group(&hdev->dev, wacom);
return 0; return 0;
fail_quirks: fail_quirks:
...@@ -1748,6 +1737,8 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless) ...@@ -1748,6 +1737,8 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
fail_shared_data: fail_shared_data:
fail_parsed: fail_parsed:
fail_allocate_inputs: fail_allocate_inputs:
fail_open_group:
wacom_release_resources(wacom);
return error; return error;
} }
...@@ -1773,14 +1764,14 @@ static void wacom_wireless_work(struct work_struct *work) ...@@ -1773,14 +1764,14 @@ static void wacom_wireless_work(struct work_struct *work)
wacom1 = hid_get_drvdata(hdev1); wacom1 = hid_get_drvdata(hdev1);
wacom_wac1 = &(wacom1->wacom_wac); wacom_wac1 = &(wacom1->wacom_wac);
wacom_destroy_leds(wacom1); wacom_destroy_leds(wacom1);
wacom_clean_inputs(wacom1); wacom_release_resources(wacom1);
/* Touch interface */ /* Touch interface */
hdev2 = usb_get_intfdata(usbdev->config->interface[2]); hdev2 = usb_get_intfdata(usbdev->config->interface[2]);
wacom2 = hid_get_drvdata(hdev2); wacom2 = hid_get_drvdata(hdev2);
wacom_wac2 = &(wacom2->wacom_wac); wacom_wac2 = &(wacom2->wacom_wac);
wacom_destroy_leds(wacom2); wacom_destroy_leds(wacom2);
wacom_clean_inputs(wacom2); wacom_release_resources(wacom2);
if (wacom_wac->pid == 0) { if (wacom_wac->pid == 0) {
hid_info(wacom->hdev, "wireless tablet disconnected\n"); hid_info(wacom->hdev, "wireless tablet disconnected\n");
...@@ -1835,9 +1826,9 @@ static void wacom_wireless_work(struct work_struct *work) ...@@ -1835,9 +1826,9 @@ static void wacom_wireless_work(struct work_struct *work)
fail: fail:
wacom_destroy_leds(wacom1); wacom_destroy_leds(wacom1);
wacom_clean_inputs(wacom1); wacom_release_resources(wacom1);
wacom_destroy_leds(wacom2); wacom_destroy_leds(wacom2);
wacom_clean_inputs(wacom2); wacom_release_resources(wacom2);
return; return;
} }
......
...@@ -1941,7 +1941,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) ...@@ -1941,7 +1941,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom)
} }
/* only update touch if we actually have a touchpad and touch data changed */ /* only update touch if we actually have a touchpad and touch data changed */
if (wacom->touch_registered && touch_changed) { if (wacom->touch_input && touch_changed) {
input_mt_sync_frame(wacom->touch_input); input_mt_sync_frame(wacom->touch_input);
wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom); wacom->shared->touch_down = wacom_wac_finger_count_touches(wacom);
} }
......
...@@ -234,9 +234,6 @@ struct wacom_wac { ...@@ -234,9 +234,6 @@ struct wacom_wac {
struct input_dev *pen_input; struct input_dev *pen_input;
struct input_dev *touch_input; struct input_dev *touch_input;
struct input_dev *pad_input; struct input_dev *pad_input;
bool pen_registered;
bool touch_registered;
bool pad_registered;
int pid; int pid;
int battery_capacity; int battery_capacity;
int num_contacts_left; int num_contacts_left;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment