Message ID | 20191009134342.6476-4-hadess@hadess.net (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add Apple MFi fastcharge USB device driver | expand |
On Wed, 9 Oct 2019, Bastien Nocera wrote: > Match a usb_device with a table of IDs. > > Signed-off-by: Bastien Nocera <hadess@hadess.net> > --- > drivers/usb/core/driver.c | 15 +++++++++++++++ > include/linux/usb.h | 2 ++ > 2 files changed, 17 insertions(+) > > diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c > index 863e380a272b..50f92da8afcf 100644 > --- a/drivers/usb/core/driver.c > +++ b/drivers/usb/core/driver.c > @@ -800,6 +800,21 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface, > } > EXPORT_SYMBOL_GPL(usb_match_id); > > +const struct usb_device_id *usb_device_match_id(struct usb_device *udev, > + const struct usb_device_id *id) > +{ > + if (!id) > + return NULL; > + > + for (; id->idVendor || id->idProduct ; id++) { > + if (usb_match_device(udev, id)) > + return id; > + } This would be better if you allowed matching against just the idVendor field rather than matching against both. That would make it a lot simpler to match all Apple devices, for instance. Alan Stern
On Wed, 2019-10-09 at 10:36 -0400, Alan Stern wrote: > On Wed, 9 Oct 2019, Bastien Nocera wrote: > > > Match a usb_device with a table of IDs. > > > > Signed-off-by: Bastien Nocera <hadess@hadess.net> > > --- > > drivers/usb/core/driver.c | 15 +++++++++++++++ > > include/linux/usb.h | 2 ++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c > > index 863e380a272b..50f92da8afcf 100644 > > --- a/drivers/usb/core/driver.c > > +++ b/drivers/usb/core/driver.c > > @@ -800,6 +800,21 @@ const struct usb_device_id > *usb_match_id(struct usb_interface *interface, > > } > > EXPORT_SYMBOL_GPL(usb_match_id); > > > > +const struct usb_device_id *usb_device_match_id(struct usb_device > *udev, > > + const struct usb_device_id *id) > > +{ > > + if (!id) > > + return NULL; > > + > > + for (; id->idVendor || id->idProduct ; id++) { > > + if (usb_match_device(udev, id)) > > + return id; > > + } > > This would be better if you allowed matching against just the > idVendor > field rather than matching against both. That would make it a lot > simpler to match all Apple devices, for instance. That should already be possible. The matching code is the same as for the USB interface drivers. Something like: static const struct usb_device_id apple_match[] = { { .match_flags = USB_DEVICE_ID_MATCH_VENDOR, .idVendor = USB_VENDOR_APPLE }, {} } And I couldn't use it in patch 5/5, as that's a range of product IDs, not all of them (which would be quite a lot more).
On Wed, 9 Oct 2019, Bastien Nocera wrote: > > This would be better if you allowed matching against just the > > idVendor > > field rather than matching against both. That would make it a lot > > simpler to match all Apple devices, for instance. > > That should already be possible. The matching code is the same as for > the USB interface drivers. > > Something like: > static const struct usb_device_id apple_match[] = { > { .match_flags = USB_DEVICE_ID_MATCH_VENDOR, > .idVendor = USB_VENDOR_APPLE > }, > {} > } > > And I couldn't use it in patch 5/5, as that's a range of product IDs, > not all of them (which would be quite a lot more). You can still use it in patch 5/5. Match any device with Apple's VID; then have the probe routine return -ENODEV if the PID is outside the range you want. Alan Stern
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 863e380a272b..50f92da8afcf 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -800,6 +800,21 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface, } EXPORT_SYMBOL_GPL(usb_match_id); +const struct usb_device_id *usb_device_match_id(struct usb_device *udev, + const struct usb_device_id *id) +{ + if (!id) + return NULL; + + for (; id->idVendor || id->idProduct ; id++) { + if (usb_match_device(udev, id)) + return id; + } + + return NULL; +} +EXPORT_SYMBOL_GPL(usb_device_match_id); + static int usb_device_match(struct device *dev, struct device_driver *drv) { /* devices and interfaces are handled separately */ diff --git a/include/linux/usb.h b/include/linux/usb.h index fb9ad3511e55..66bd4344e298 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -864,6 +864,8 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface, const struct usb_device_id *id); extern int usb_match_one_id(struct usb_interface *interface, const struct usb_device_id *id); +const struct usb_device_id *usb_device_match_id(struct usb_device *udev, + const struct usb_device_id *id); extern int usb_for_each_dev(void *data, int (*fn)(struct usb_device *, void *)); extern struct usb_interface *usb_find_interface(struct usb_driver *drv,
Match a usb_device with a table of IDs. Signed-off-by: Bastien Nocera <hadess@hadess.net> --- drivers/usb/core/driver.c | 15 +++++++++++++++ include/linux/usb.h | 2 ++ 2 files changed, 17 insertions(+)