diff mbox series

[3/5] USB: Implement usb_device_match_id()

Message ID 20191009134342.6476-4-hadess@hadess.net (mailing list archive)
State Superseded
Headers show
Series Add Apple MFi fastcharge USB device driver | expand

Commit Message

Bastien Nocera Oct. 9, 2019, 1:43 p.m. UTC
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(+)

Comments

Alan Stern Oct. 9, 2019, 2:36 p.m. UTC | #1
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
Bastien Nocera Oct. 9, 2019, 3:40 p.m. UTC | #2
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).
Alan Stern Oct. 9, 2019, 5:29 p.m. UTC | #3
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 mbox series

Patch

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,