X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=target%2Flinux%2Fgeneric%2Ffiles%2Fdrivers%2Fleds%2Fledtrig-usbdev.c;fp=target%2Flinux%2Fgeneric%2Ffiles%2Fdrivers%2Fleds%2Fledtrig-usbdev.c;h=effcae6f9ec3676a910edab744d58c86118ffb13;hb=5ea8756766a5ba148e47075265743f727ef1d6dc;hp=70b0e392ad2444a87b3ff78ac2d91012e1735a5d;hpb=e633a1b48f8504a17ea1d2d89ed760da03e41380;p=openwrt%2Fstaging%2Fchunkeey.git 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 */