/* SPDX-License-Identifier: GPL-2.0+ */
|
/* Copyright (C) 2004 Texas Instruments */
|
|
/*
|
* This OTG and Embedded Host list is "Targeted Peripheral List".
|
* It should mostly use of USB_DEVICE() or USB_DEVICE_VER() entries..
|
*
|
* YOU _SHOULD_ CHANGE THIS LIST TO MATCH YOUR PRODUCT AND ITS TESTING!
|
*/
|
|
static struct usb_device_id productlist_table[] = {
|
|
/* hubs are optional in OTG, but very handy ... */
|
{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 0), },
|
{ USB_DEVICE_INFO(USB_CLASS_HUB, 0, 1), },
|
|
#ifdef CONFIG_USB_PRINTER /* ignoring nonstatic linkage! */
|
/* FIXME actually, printers are NOT supposed to use device classes;
|
* they're supposed to use interface classes...
|
*/
|
{ USB_DEVICE_INFO(7, 1, 1) },
|
{ USB_DEVICE_INFO(7, 1, 2) },
|
{ USB_DEVICE_INFO(7, 1, 3) },
|
#endif
|
|
#ifdef CONFIG_USB_NET_CDCETHER
|
/* Linux-USB CDC Ethernet gadget */
|
{ USB_DEVICE(0x0525, 0xa4a1), },
|
/* Linux-USB CDC Ethernet + RNDIS gadget */
|
{ USB_DEVICE(0x0525, 0xa4a2), },
|
#endif
|
|
#if IS_ENABLED(CONFIG_USB_TEST)
|
/* gadget zero, for testing */
|
{ USB_DEVICE(0x0525, 0xa4a0), },
|
#endif
|
|
{ } /* Terminating entry */
|
};
|
|
static int is_targeted(struct usb_device *dev)
|
{
|
struct usb_device_id *id = productlist_table;
|
|
/* HNP test device is _never_ targeted (see OTG spec 6.6.6) */
|
if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a &&
|
le16_to_cpu(dev->descriptor.idProduct) == 0xbadd))
|
return 0;
|
|
/* OTG PET device is always targeted (see OTG 2.0 ECN 6.4.2) */
|
if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a &&
|
le16_to_cpu(dev->descriptor.idProduct) == 0x0200))
|
return 1;
|
|
/* NOTE: can't use usb_match_id() since interface caches
|
* aren't set up yet. this is cut/paste from that code.
|
*/
|
for (id = productlist_table; id->match_flags; id++) {
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
|
id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
|
continue;
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
|
id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
|
continue;
|
|
/* No need to test id->bcdDevice_lo != 0, since 0 is never
|
greater than any unsigned number. */
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&
|
(id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))
|
continue;
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&
|
(id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice)))
|
continue;
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&
|
(id->bDeviceClass != dev->descriptor.bDeviceClass))
|
continue;
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&
|
(id->bDeviceSubClass != dev->descriptor.bDeviceSubClass))
|
continue;
|
|
if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&
|
(id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))
|
continue;
|
|
return 1;
|
}
|
|
/* add other match criteria here ... */
|
|
|
/* OTG MESSAGE: report errors here, customize to match your product */
|
dev_err(&dev->dev, "device v%04x p%04x is not supported\n",
|
le16_to_cpu(dev->descriptor.idVendor),
|
le16_to_cpu(dev->descriptor.idProduct));
|
|
return 0;
|
}
|