From: Benjamin Tissoires <benjamin.tissoi...@redhat.com>

Like remotes, LEDs should be handled by themself, not magically behind
the inputs as they have a complete different life.

Signed-off-by: Benjamin Tissoires <benjamin.tissoi...@redhat.com>
Acked-by: Ping Cheng <pi...@wacom.com>
Signed-off-by: Jiri Kosina <jkos...@suse.cz>
[aaron.sko...@wacom.com: Imported into input-wacom repository (85d2c77)]
Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
[aaron.sko...@wacom.com: Backported from input-wacom repository (5fba033)]
Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
---
 2.6.38/wacom_sys.c | 21 +++++++++++----------
 3.17/wacom_sys.c   | 20 +++++++++++---------
 3.7/wacom_sys.c    | 22 ++++++++++++----------
 3 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/2.6.38/wacom_sys.c b/2.6.38/wacom_sys.c
index 10bd0fa..3cfe780 100644
--- a/2.6.38/wacom_sys.c
+++ b/2.6.38/wacom_sys.c
@@ -1414,7 +1414,6 @@ static void wacom_unregister_inputs(struct wacom *wacom)
        if (wacom->wacom_wac.input)
                input_unregister_device(wacom->wacom_wac.input);
        wacom->wacom_wac.input = NULL;
-       wacom_destroy_leds(wacom);
 }
 
 static int wacom_register_input(struct wacom *wacom)
@@ -1451,15 +1450,8 @@ static int wacom_register_input(struct wacom *wacom)
        if (error)
                goto fail2;
 
-       error = wacom_initialize_leds(wacom);
-       if (error)
-               goto fail3;
-
        return 0;
 
-fail3:
-       input_unregister_device(input_dev);
-       input_dev = NULL;
 fail2:
        if (input_dev)
                input_free_device(input_dev);
@@ -1517,11 +1509,13 @@ static void wacom_wireless_work(struct work_struct 
*work)
        /* Stylus interface */
        wacom1 = usb_get_intfdata(usbdev->config->interface[1]);
        wacom_wac1 = &(wacom1->wacom_wac);
+       wacom_destroy_leds(wacom1);
        wacom_unregister_inputs(wacom1);
 
        /* Touch interface */
        wacom2 = usb_get_intfdata(usbdev->config->interface[2]);
        wacom_wac2 = &(wacom2->wacom_wac);
+       wacom_destroy_leds(wacom2);
        wacom_unregister_inputs(wacom2);
 
        if (wacom_wac->pid == 0) {
@@ -1600,7 +1594,9 @@ static void wacom_wireless_work(struct work_struct *work)
        return;
 
 fail:
+       wacom_destroy_leds(wacom1);
        wacom_unregister_inputs(wacom1);
+       wacom_destroy_leds(wacom2);
        wacom_unregister_inputs(wacom2);
        return;
 }
@@ -1723,10 +1719,14 @@ static int wacom_probe(struct usb_interface *intf, 
const struct usb_device_id *i
                }
        }
 
+       error = wacom_initialize_leds(wacom);
+       if (error)
+               goto fail4;
+
        if (wacom->wacom_wac.features.type == REMOTE) {
                error = wacom_initialize_remote(wacom);
                if (error)
-                       goto fail4;
+                       goto fail_remote;
        }
 
        if ((wacom_wac->features.type == INTUOSHT ||
@@ -1739,7 +1739,7 @@ static int wacom_probe(struct usb_interface *intf, const 
struct usb_device_id *i
        }
 
        return 0;
-
+ fail_remote: wacom_destroy_leds(wacom);
  fail4:        wacom_remove_shared_data(wacom_wac);
  fail3:        usb_free_urb(wacom->irq);
        wacom_destroy_battery(wacom);
@@ -1757,6 +1757,7 @@ static void wacom_disconnect(struct usb_interface *intf)
        usb_kill_urb(wacom->irq);
        cancel_work_sync(&wacom->work);
        kobject_put(wacom->remote_dir);
+       wacom_destroy_leds(wacom);
        wacom_unregister_inputs(wacom);
        wacom_destroy_battery(wacom);
        usb_free_urb(wacom->irq);
diff --git a/3.17/wacom_sys.c b/3.17/wacom_sys.c
index ca4b362..ad492aa 100644
--- a/3.17/wacom_sys.c
+++ b/3.17/wacom_sys.c
@@ -1437,7 +1437,6 @@ static void wacom_clean_inputs(struct wacom *wacom)
        wacom->wacom_wac.pen_registered = false;
        wacom->wacom_wac.touch_registered = false;
        wacom->wacom_wac.pad_registered = false;
-       wacom_destroy_leds(wacom);
 }
 
 static int wacom_allocate_inputs(struct wacom *wacom)
@@ -1509,18 +1508,10 @@ static int wacom_register_inputs(struct wacom *wacom)
                if (error)
                        goto fail_register_pad_input;
                wacom_wac->pad_registered = true;
-
-               error = wacom_initialize_leds(wacom);
-               if (error)
-                       goto fail_leds;
        }
 
        return 0;
 
-fail_leds:
-       input_unregister_device(pad_input_dev);
-       pad_input_dev = NULL;
-       wacom_wac->pad_registered = false;
 fail_register_pad_input:
        if (touch_input_dev)
                input_unregister_device(touch_input_dev);
@@ -1718,6 +1709,10 @@ static int wacom_parse_and_register(struct wacom *wacom, 
bool wireless)
                goto fail_register_inputs;
 
        if (wacom->wacom_wac.features.device_type & WACOM_DEVICETYPE_PAD) {
+               error = wacom_initialize_leds(wacom);
+               if (error)
+                       goto fail_leds;
+
                error = wacom_initialize_remote(wacom);
                if (error)
                        goto fail_remote;
@@ -1774,6 +1769,8 @@ fail_quirks:
 fail_hw_start:
        kobject_put(wacom->remote_dir);
 fail_remote:
+       wacom_destroy_leds(wacom);
+fail_leds:
        wacom_clean_inputs(wacom);
 fail_register_inputs:
        wacom_destroy_battery(wacom);
@@ -1807,12 +1804,14 @@ static void wacom_wireless_work(struct work_struct 
*work)
        hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
        wacom1 = hid_get_drvdata(hdev1);
        wacom_wac1 = &(wacom1->wacom_wac);
+       wacom_destroy_leds(wacom1);
        wacom_clean_inputs(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);
 
        if (wacom_wac->pid == 0) {
@@ -1867,7 +1866,9 @@ static void wacom_wireless_work(struct work_struct *work)
        return;
 
 fail:
+       wacom_destroy_leds(wacom1);
        wacom_clean_inputs(wacom1);
+       wacom_destroy_leds(wacom2);
        wacom_clean_inputs(wacom2);
        return;
 }
@@ -1955,6 +1956,7 @@ static void wacom_remove(struct hid_device *hdev)
 
        cancel_work_sync(&wacom->work);
        kobject_put(wacom->remote_dir);
+       wacom_destroy_leds(wacom);
        wacom_clean_inputs(wacom);
        if (hdev->bus == BUS_BLUETOOTH)
                device_remove_file(&hdev->dev, &dev_attr_speed);
diff --git a/3.7/wacom_sys.c b/3.7/wacom_sys.c
index a36a751..6a815bd 100644
--- a/3.7/wacom_sys.c
+++ b/3.7/wacom_sys.c
@@ -1408,7 +1408,6 @@ static void wacom_unregister_inputs(struct wacom *wacom)
        if (wacom->wacom_wac.input)
                input_unregister_device(wacom->wacom_wac.input);
        wacom->wacom_wac.input = NULL;
-       wacom_destroy_leds(wacom);
 }
 
 static int wacom_register_input(struct wacom *wacom)
@@ -1445,16 +1444,8 @@ static int wacom_register_input(struct wacom *wacom)
        if (error)
                goto fail2;
 
-
-       error = wacom_initialize_leds(wacom);
-       if (error)
-               goto fail3;
-
        return 0;
 
-fail3:
-       input_unregister_device(input_dev);
-       input_dev = NULL;
 fail2:
        if (input_dev)
                input_free_device(input_dev);
@@ -1515,11 +1506,13 @@ static void wacom_wireless_work(struct work_struct 
*work)
        /* Stylus interface */
        wacom1 = usb_get_intfdata(usbdev->config->interface[1]);
        wacom_wac1 = &(wacom1->wacom_wac);
+       wacom_destroy_leds(wacom1);
        wacom_unregister_inputs(wacom1);
 
        /* Touch interface */
        wacom2 = usb_get_intfdata(usbdev->config->interface[2]);
        wacom_wac2 = &(wacom2->wacom_wac);
+       wacom_destroy_leds(wacom2);
        wacom_unregister_inputs(wacom2);
 
        if (wacom_wac->pid == 0) {
@@ -1598,7 +1591,9 @@ static void wacom_wireless_work(struct work_struct *work)
        return;
 
 fail:
+       wacom_destroy_leds(wacom1);
        wacom_unregister_inputs(wacom1);
+       wacom_destroy_leds(wacom2);
        wacom_unregister_inputs(wacom2);
        return;
 }
@@ -1721,10 +1716,14 @@ static int wacom_probe(struct usb_interface *intf, 
const struct usb_device_id *i
                }
        }
 
+       error = wacom_initialize_leds(wacom);
+       if (error)
+               goto fail4;
+
        if (wacom->wacom_wac.features.type == REMOTE) {
                error = wacom_initialize_remote(wacom);
                if (error)
-                       goto fail4;
+                       goto fail_remote;
        }
 
        if ((wacom_wac->features.type == INTUOSHT ||
@@ -1738,6 +1737,8 @@ static int wacom_probe(struct usb_interface *intf, const 
struct usb_device_id *i
 
        return 0;
 
+ fail_remote:
+       wacom_destroy_leds(wacom);
  fail4:        wacom_remove_shared_data(wacom_wac);
  fail3:        usb_free_urb(wacom->irq);
        wacom_destroy_battery(wacom);
@@ -1755,6 +1756,7 @@ static void wacom_disconnect(struct usb_interface *intf)
        usb_kill_urb(wacom->irq);
        cancel_work_sync(&wacom->work);
        kobject_put(wacom->remote_dir);
+       wacom_destroy_leds(wacom);
        wacom_unregister_inputs(wacom);
        wacom_destroy_battery(wacom);
        usb_free_urb(wacom->irq);
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to