aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--target/linux/generic/files/drivers/leds/ledtrig-usbdev.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/target/linux/generic/files/drivers/leds/ledtrig-usbdev.c b/target/linux/generic/files/drivers/leds/ledtrig-usbdev.c
index 70b0e392ad..effcae6f9e 100644
--- a/target/linux/generic/files/drivers/leds/ledtrig-usbdev.c
+++ b/target/linux/generic/files/drivers/leds/ledtrig-usbdev.c
@@ -83,6 +83,26 @@ static ssize_t usbdev_trig_name_show(struct device *dev,
return strlen(buf) + 1;
}
+struct usbdev_trig_match {
+ char *device_name;
+ struct usb_device *usb_dev;
+};
+
+static int usbdev_trig_find_usb_dev(struct usb_device *usb_dev, void *data)
+{
+ struct usbdev_trig_match *match = data;
+
+ if (WARN_ON(match->usb_dev))
+ return 0;
+
+ if (!strcmp(dev_name(&usb_dev->dev), match->device_name)) {
+ dev_dbg(&usb_dev->dev, "matched this device!\n");
+ match->usb_dev = usb_get_dev(usb_dev);
+ }
+
+ return 0;
+}
+
static ssize_t usbdev_trig_name_store(struct device *dev,
struct device_attribute *attr,
const char *buf,
@@ -101,16 +121,18 @@ static ssize_t usbdev_trig_name_store(struct device *dev,
td->device_name[size - 1] = 0;
if (td->device_name[0] != 0) {
- struct usb_device *usb_dev;
+ struct usbdev_trig_match match = {
+ .device_name = td->device_name,
+ };
/* check for existing device to update from */
- usb_dev = usb_find_device_by_name(td->device_name);
- if (usb_dev) {
+ usb_for_each_dev(&match, usbdev_trig_find_usb_dev);
+ if (match.usb_dev) {
if (td->usb_dev)
usb_put_dev(td->usb_dev);
- td->usb_dev = usb_dev;
- td->last_urbnum = atomic_read(&usb_dev->urbnum);
+ td->usb_dev = match.usb_dev;
+ td->last_urbnum = atomic_read(&match.usb_dev->urbnum);
}
/* updates LEDs, may start timers */