blob: 58d8ab57950d589f9ef6ba006a95c0370e669e0d [file] [log] [blame]
From foo@baz Fri Jan 24 11:26:09 PST 2014
Date: Fri, 24 Jan 2014 11:26:09 -0800
To: Greg KH <gregkh@linuxfoundation.org>
From: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
Subject: [PATCH] Input: xpad: Set the correct LED number
From: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
The LED number should not just be incremented every time, that doesn't
work, set the number based on the number it actually is.
Note, the joydev subsystem doesn't allow us to easily find out the minor
number, so we have to walk all devices in order to find a joystick
device by looking at the name of the device. Odds are, this isn't the
best way to do it, but I don't know of any other way at the moment.
Signed-off-by: "Pierre-Loup A. Griffais" <pgriffais@valvesoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/input/joystick/xpad.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -293,6 +293,7 @@ struct usb_xpad {
int mapping; /* map d-pad to buttons or to axes */
int xtype; /* type of xbox device */
+ int joydev_id; /* the minor of the device */
const char *name; /* name of the device */
};
@@ -789,11 +790,6 @@ static int xpad_led_probe(struct usb_xpa
return error;
}
- /*
- * Light up the segment corresponding to controller number
- */
- xpad_send_led_command(xpad, (led_no % 4) + 2);
-
return 0;
}
@@ -809,6 +805,7 @@ static void xpad_led_disconnect(struct u
#else
static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
static void xpad_led_disconnect(struct usb_xpad *xpad) { }
+static void xpad_send_led_command(struct usb_xpad *xpad, int command) { }
#endif
@@ -859,9 +856,17 @@ static void xpad_set_up_abs(struct input
}
}
+static int xpad_find_joydev(struct device *dev, void *data)
+{
+ if (strstr(dev_name(dev), "js"))
+ return 1;
+ return 0;
+}
+
static int xpad_init_input(struct usb_xpad *xpad)
{
struct input_dev *input_dev;
+ struct device *joydev_dev;
int i, error;
input_dev = input_allocate_device();
@@ -930,6 +935,17 @@ static int xpad_init_input(struct usb_xp
if (error)
goto fail_input_register;
+ joydev_dev = device_find_child(&xpad->dev->dev, NULL,
+ xpad_find_joydev);
+ if (joydev_dev) {
+ dev_dbg(&xpad->dev->dev, "Found xpad with minor %i\n",
+ MINOR(joydev_dev->devt));
+ xpad->joydev_id = MINOR(joydev_dev->devt);
+
+ /* Light up the segment corresponding to controller number */
+ xpad_send_led_command(xpad, (xpad->joydev_id % 4) + 2);
+ }
+
return 0;
fail_input_register: