1/* 2 * USB device controllers have lots of quirks. Use these macros in 3 * gadget drivers or other code that needs to deal with them, and which 4 * autoconfigures instead of using early binding to the hardware. 5 * 6 * This SHOULD eventually work like the ARM mach_is_*() stuff, driven by 7 * some config file that gets updated as new hardware is supported. 8 * (And avoiding all runtime comparisons in typical one-choice configs!) 9 * 10 * NOTE: some of these controller drivers may not be available yet. 11 * Some are available on 2.4 kernels; several are available, but not 12 * yet pushed in the 2.6 mainline tree. 13 */ 14 15#ifndef __GADGET_CHIPS_H 16#define __GADGET_CHIPS_H 17 18#ifdef CONFIG_USB_GADGET_NET2280 19#define gadget_is_net2280(g) !strcmp("net2280", (g)->name) 20#else 21#define gadget_is_net2280(g) 0 22#endif 23 24#ifdef CONFIG_USB_GADGET_AMD5536UDC 25#define gadget_is_amd5536udc(g) !strcmp("amd5536udc", (g)->name) 26#else 27#define gadget_is_amd5536udc(g) 0 28#endif 29 30#ifdef CONFIG_USB_GADGET_DUMMY_HCD 31#define gadget_is_dummy(g) !strcmp("dummy_udc", (g)->name) 32#else 33#define gadget_is_dummy(g) 0 34#endif 35 36#ifdef CONFIG_USB_GADGET_PXA25X 37#define gadget_is_pxa(g) !strcmp("pxa25x_udc", (g)->name) 38#else 39#define gadget_is_pxa(g) 0 40#endif 41 42#ifdef CONFIG_USB_GADGET_GOKU 43#define gadget_is_goku(g) !strcmp("goku_udc", (g)->name) 44#else 45#define gadget_is_goku(g) 0 46#endif 47 48#ifdef CONFIG_USB_GADGET_LH7A40X 49#define gadget_is_lh7a40x(g) !strcmp("lh7a40x_udc", (g)->name) 50#else 51#define gadget_is_lh7a40x(g) 0 52#endif 53 54#ifdef CONFIG_USB_GADGET_OMAP 55#define gadget_is_omap(g) !strcmp("omap_udc", (g)->name) 56#else 57#define gadget_is_omap(g) 0 58#endif 59 60/* various unstable versions available */ 61#ifdef CONFIG_USB_GADGET_PXA27X 62#define gadget_is_pxa27x(g) !strcmp("pxa27x_udc", (g)->name) 63#else 64#define gadget_is_pxa27x(g) 0 65#endif 66 67#ifdef CONFIG_USB_GADGET_ATMEL_USBA 68#define gadget_is_atmel_usba(g) !strcmp("atmel_usba_udc", (g)->name) 69#else 70#define gadget_is_atmel_usba(g) 0 71#endif 72 73#ifdef CONFIG_USB_GADGET_S3C2410 74#define gadget_is_s3c2410(g) !strcmp("s3c2410_udc", (g)->name) 75#else 76#define gadget_is_s3c2410(g) 0 77#endif 78 79#ifdef CONFIG_USB_GADGET_AT91 80#define gadget_is_at91(g) !strcmp("at91_udc", (g)->name) 81#else 82#define gadget_is_at91(g) 0 83#endif 84 85#ifdef CONFIG_USB_GADGET_IMX 86#define gadget_is_imx(g) !strcmp("imx_udc", (g)->name) 87#else 88#define gadget_is_imx(g) 0 89#endif 90 91#ifdef CONFIG_USB_GADGET_FSL_USB2 92#define gadget_is_fsl_usb2(g) !strcmp("fsl-usb2-udc", (g)->name) 93#else 94#define gadget_is_fsl_usb2(g) 0 95#endif 96 97/* Mentor high speed "dual role" controller, in peripheral role */ 98#ifdef CONFIG_USB_GADGET_MUSB_HDRC 99#define gadget_is_musbhdrc(g) !strcmp("musb_hdrc", (g)->name) 100#else 101#define gadget_is_musbhdrc(g) 0 102#endif 103 104#ifdef CONFIG_USB_GADGET_LANGWELL 105#define gadget_is_langwell(g) (!strcmp("langwell_udc", (g)->name)) 106#else 107#define gadget_is_langwell(g) 0 108#endif 109 110#ifdef CONFIG_USB_GADGET_M66592 111#define gadget_is_m66592(g) !strcmp("m66592_udc", (g)->name) 112#else 113#define gadget_is_m66592(g) 0 114#endif 115 116/* Freescale CPM/QE UDC SUPPORT */ 117#ifdef CONFIG_USB_GADGET_FSL_QE 118#define gadget_is_fsl_qe(g) !strcmp("fsl_qe_udc", (g)->name) 119#else 120#define gadget_is_fsl_qe(g) 0 121#endif 122 123#ifdef CONFIG_USB_GADGET_CI13XXX 124#define gadget_is_ci13xxx(g) (!strcmp("ci13xxx_udc", (g)->name)) 125#else 126#define gadget_is_ci13xxx(g) 0 127#endif 128 129// CONFIG_USB_GADGET_SX2 130// CONFIG_USB_GADGET_AU1X00 131// ... 132 133#ifdef CONFIG_USB_GADGET_R8A66597 134#define gadget_is_r8a66597(g) !strcmp("r8a66597_udc", (g)->name) 135#else 136#define gadget_is_r8a66597(g) 0 137#endif 138 139#ifdef CONFIG_USB_S3C_HSOTG 140#define gadget_is_s3c_hsotg(g) (!strcmp("s3c-hsotg", (g)->name)) 141#else 142#define gadget_is_s3c_hsotg(g) 0 143#endif 144 145 146/** 147 * usb_gadget_controller_number - support bcdDevice id convention 148 * @gadget: the controller being driven 149 * 150 * Return a 2-digit BCD value associated with the peripheral controller, 151 * suitable for use as part of a bcdDevice value, or a negative error code. 152 * 153 * NOTE: this convention is purely optional, and has no meaning in terms of 154 * any USB specification. If you want to use a different convention in your 155 * gadget driver firmware -- maybe a more formal revision ID -- feel free. 156 * 157 * Hosts see these bcdDevice numbers, and are allowed (but not encouraged!) 158 * to change their behavior accordingly. For example it might help avoiding 159 * some chip bug. 160 */ 161static inline int usb_gadget_controller_number(struct usb_gadget *gadget) 162{ 163 if (gadget_is_net2280(gadget)) 164 return 0x01; 165 else if (gadget_is_dummy(gadget)) 166 return 0x02; 167 else if (gadget_is_pxa(gadget)) 168 return 0x03; 169 else if (gadget_is_goku(gadget)) 170 return 0x06; 171 else if (gadget_is_omap(gadget)) 172 return 0x08; 173 else if (gadget_is_lh7a40x(gadget)) 174 return 0x09; 175 else if (gadget_is_pxa27x(gadget)) 176 return 0x11; 177 else if (gadget_is_s3c2410(gadget)) 178 return 0x12; 179 else if (gadget_is_at91(gadget)) 180 return 0x13; 181 else if (gadget_is_imx(gadget)) 182 return 0x14; 183 else if (gadget_is_musbhdrc(gadget)) 184 return 0x16; 185 else if (gadget_is_atmel_usba(gadget)) 186 return 0x18; 187 else if (gadget_is_fsl_usb2(gadget)) 188 return 0x19; 189 else if (gadget_is_amd5536udc(gadget)) 190 return 0x20; 191 else if (gadget_is_m66592(gadget)) 192 return 0x21; 193 else if (gadget_is_fsl_qe(gadget)) 194 return 0x22; 195 else if (gadget_is_ci13xxx(gadget)) 196 return 0x23; 197 else if (gadget_is_langwell(gadget)) 198 return 0x24; 199 else if (gadget_is_r8a66597(gadget)) 200 return 0x25; 201 else if (gadget_is_s3c_hsotg(gadget)) 202 return 0x26; 203 return -ENOENT; 204} 205 206 207/** 208 * gadget_supports_altsettings - return true if altsettings work 209 * @gadget: the gadget in question 210 */ 211static inline bool gadget_supports_altsettings(struct usb_gadget *gadget) 212{ 213 /* PXA 21x/25x/26x has no altsettings at all */ 214 if (gadget_is_pxa(gadget)) 215 return false; 216 217 /* PXA 27x and 3xx have *broken* altsetting support */ 218 if (gadget_is_pxa27x(gadget)) 219 return false; 220 221 /* Everything else is *presumably* fine ... */ 222 return true; 223} 224 225#endif /* __GADGET_CHIPS_H */ 226