Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * drivers/usb/core/otg_whitelist.h | |
3 | * | |
4 | * Copyright (C) 2004 Texas Instruments | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License as published by | |
8 | * the Free Software Foundation; either version 2 of the License, or | |
9 | * (at your option) any later version. | |
10 | */ | |
11 | ||
12 | /* | |
13 | * This OTG Whitelist is the OTG "Targeted Peripheral List". It should | |
14 | * mostly use of USB_DEVICE() or USB_DEVICE_VER() entries.. | |
15 | * | |
16 | * YOU _SHOULD_ CHANGE THIS LIST TO MATCH YOUR PRODUCT AND ITS TESTING! | |
84cca820 | 17 | */ |
1da177e4 LT |
18 | |
19 | static struct usb_device_id whitelist_table [] = { | |
20 | ||
21 | /* hubs are optional in OTG, but very handy ... */ | |
22 | { USB_DEVICE_INFO(USB_CLASS_HUB, 0, 0), }, | |
23 | { USB_DEVICE_INFO(USB_CLASS_HUB, 0, 1), }, | |
24 | ||
25 | #ifdef CONFIG_USB_PRINTER /* ignoring nonstatic linkage! */ | |
26 | /* FIXME actually, printers are NOT supposed to use device classes; | |
27 | * they're supposed to use interface classes... | |
28 | */ | |
29 | { USB_DEVICE_INFO(7, 1, 1) }, | |
30 | { USB_DEVICE_INFO(7, 1, 2) }, | |
31 | { USB_DEVICE_INFO(7, 1, 3) }, | |
32 | #endif | |
33 | ||
7fe89e9c | 34 | #ifdef CONFIG_USB_NET_CDCETHER |
1da177e4 LT |
35 | /* Linux-USB CDC Ethernet gadget */ |
36 | { USB_DEVICE(0x0525, 0xa4a1), }, | |
37 | /* Linux-USB CDC Ethernet + RNDIS gadget */ | |
38 | { USB_DEVICE(0x0525, 0xa4a2), }, | |
39 | #endif | |
40 | ||
41 | #if defined(CONFIG_USB_TEST) || defined(CONFIG_USB_TEST_MODULE) | |
42 | /* gadget zero, for testing */ | |
43 | { USB_DEVICE(0x0525, 0xa4a0), }, | |
44 | #endif | |
45 | ||
46 | { } /* Terminating entry */ | |
47 | }; | |
48 | ||
49 | static int is_targeted(struct usb_device *dev) | |
50 | { | |
51 | struct usb_device_id *id = whitelist_table; | |
52 | ||
53 | /* possible in developer configs only! */ | |
54 | if (!dev->bus->otg_port) | |
55 | return 1; | |
56 | ||
57 | /* HNP test device is _never_ targeted (see OTG spec 6.6.6) */ | |
84cca820 | 58 | if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1a0a && |
1da177e4 LT |
59 | le16_to_cpu(dev->descriptor.idProduct) == 0xbadd)) |
60 | return 0; | |
61 | ||
62 | /* NOTE: can't use usb_match_id() since interface caches | |
63 | * aren't set up yet. this is cut/paste from that code. | |
64 | */ | |
65 | for (id = whitelist_table; id->match_flags; id++) { | |
66 | if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && | |
67 | id->idVendor != le16_to_cpu(dev->descriptor.idVendor)) | |
68 | continue; | |
69 | ||
70 | if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && | |
71 | id->idProduct != le16_to_cpu(dev->descriptor.idProduct)) | |
72 | continue; | |
73 | ||
74 | /* No need to test id->bcdDevice_lo != 0, since 0 is never | |
75 | greater than any unsigned number. */ | |
76 | if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && | |
77 | (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice))) | |
78 | continue; | |
79 | ||
80 | if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && | |
81 | (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice))) | |
82 | continue; | |
83 | ||
84 | if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && | |
85 | (id->bDeviceClass != dev->descriptor.bDeviceClass)) | |
86 | continue; | |
87 | ||
88 | if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) && | |
84cca820 | 89 | (id->bDeviceSubClass != dev->descriptor.bDeviceSubClass)) |
1da177e4 LT |
90 | continue; |
91 | ||
92 | if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && | |
93 | (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) | |
94 | continue; | |
95 | ||
96 | return 1; | |
97 | } | |
98 | ||
99 | /* add other match criteria here ... */ | |
100 | ||
101 | ||
102 | /* OTG MESSAGE: report errors here, customize to match your product */ | |
103 | dev_err(&dev->dev, "device v%04x p%04x is not supported\n", | |
104 | le16_to_cpu(dev->descriptor.idVendor), | |
105 | le16_to_cpu(dev->descriptor.idProduct)); | |
106 | #ifdef CONFIG_USB_OTG_WHITELIST | |
107 | return 0; | |
108 | #else | |
109 | return 1; | |
110 | #endif | |
111 | } | |
112 |