1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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)
|