|
|
|
@ -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 */ |
|
|
|
|