aboutsummaryrefslogtreecommitdiffstats
path: root/input-xpad-properly-name-the-led-class-devices.patch
diff options
Diffstat (limited to 'input-xpad-properly-name-the-led-class-devices.patch')
-rw-r--r--input-xpad-properly-name-the-led-class-devices.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/input-xpad-properly-name-the-led-class-devices.patch b/input-xpad-properly-name-the-led-class-devices.patch
new file mode 100644
index 00000000000000..5bb65928d5fd17
--- /dev/null
+++ b/input-xpad-properly-name-the-led-class-devices.patch
@@ -0,0 +1,93 @@
+From foo@baz Fri Jan 31 13:18:58 CET 2014
+Date: Fri, 31 Jan 2014 13:18:58 +0100
+To: Greg KH <gregkh@linuxfoundation.org>
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Subject: [PATCH] Input: xpad: properly name the LED class devices
+
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+Don't just increment the LED device number, but use the joystick id so
+that you have a chance to associate the LED device to the correct xpad
+device by the name, instead of having to use the sysfs tree, which
+really doesn't work.
+
+Cc: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/input/joystick/xpad.c | 40 +++++++++++++++++-----------------------
+ 1 file changed, 17 insertions(+), 23 deletions(-)
+
+--- a/drivers/input/joystick/xpad.c
++++ b/drivers/input/joystick/xpad.c
+@@ -781,8 +781,6 @@ static void xpad_led_set(struct led_clas
+
+ static int xpad_led_probe(struct usb_xpad *xpad)
+ {
+- static atomic_t led_seq = ATOMIC_INIT(0);
+- long led_no;
+ struct xpad_led *led;
+ struct led_classdev *led_cdev;
+ int error;
+@@ -794,9 +792,7 @@ static int xpad_led_probe(struct usb_xpa
+ if (!led)
+ return -ENOMEM;
+
+- led_no = (long)atomic_inc_return(&led_seq) - 1;
+-
+- snprintf(led->name, sizeof(led->name), "xpad%ld", led_no);
++ snprintf(led->name, sizeof(led->name), "xpad%d", xpad->joydev_id);
+ led->xpad = xpad;
+
+ led_cdev = &led->led_cdev;
+@@ -944,16 +940,17 @@ static int xpad_init_input(struct usb_xp
+ }
+
+ error = xpad_init_ff(xpad);
+- if (error)
+- goto fail_init_ff;
+-
+- error = xpad_led_probe(xpad);
+- if (error)
+- goto fail_init_led;
++ if (error) {
++ input_free_device(input_dev);
++ return error;
++ }
+
+ error = input_register_device(xpad->dev);
+- if (error)
+- goto fail_input_register;
++ if (error) {
++ input_ff_destroy(input_dev);
++ input_free_device(input_dev);
++ return error;
++ }
+
+ joydev_dev = device_find_child(&xpad->dev->dev, NULL,
+ xpad_find_joydev);
+@@ -966,17 +963,14 @@ static int xpad_init_input(struct usb_xp
+ xpad_send_led_command(xpad, (xpad->joydev_id % 4) + 2);
+ }
+
+- return 0;
+-
+-fail_input_register:
+- xpad_led_disconnect(xpad);
+-
+-fail_init_led:
+- input_ff_destroy(input_dev);
++ error = xpad_led_probe(xpad);
++ if (error) {
++ input_ff_destroy(input_dev);
++ input_unregister_device(input_dev);
++ return error;
++ }
+
+-fail_init_ff:
+- input_free_device(input_dev);
+- return error;
++ return 0;
+ }
+
+ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id)