11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * USB device controllers have lots of quirks. Use these macros in 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * gadget drivers or other code that needs to deal with them, and which 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * autoconfigures instead of using early binding to the hardware. 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61c05ad4447e4ecbd61647c102fb6f2f5a6634ff3David Brownell * This SHOULD eventually work like the ARM mach_is_*() stuff, driven by 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * some config file that gets updated as new hardware is supported. 81c05ad4447e4ecbd61647c102fb6f2f5a6634ff3David Brownell * (And avoiding all runtime comparisons in typical one-choice configs!) 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: some of these controller drivers may not be available yet. 117f9985c2e4e5555b750d6f891b4923e63cc834c1David Brownell * Some are available on 2.4 kernels; several are available, but not 127f9985c2e4e5555b750d6f891b4923e63cc834c1David Brownell * yet pushed in the 2.6 mainline tree. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14e67d70f2f55d90c79dcb384ad5b798f0f9a68085Felipe Balbi 15e67d70f2f55d90c79dcb384ad5b798f0f9a68085Felipe Balbi#ifndef __GADGET_CHIPS_H 16e67d70f2f55d90c79dcb384ad5b798f0f9a68085Felipe Balbi#define __GADGET_CHIPS_H 17e67d70f2f55d90c79dcb384ad5b798f0f9a68085Felipe Balbi 18199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi/* 19199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * NOTICE: the entries below are alphabetical and should be kept 20199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * that way. 21199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * 22199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * Always be sure to add new entries to the correct position or 23199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * accept the bashing later. 24199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * 25199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * If you have forgotten the alphabetical order let VIM/EMACS 26199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi * do that for you. 27199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi */ 28199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_amd5536udc(g) (!strcmp("amd5536udc", (g)->name)) 29199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_at91(g) (!strcmp("at91_udc", (g)->name)) 30199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_atmel_usba(g) (!strcmp("atmel_usba_udc", (g)->name)) 3133f82f387b9cb27bc903e1368fce88b73213910aPavankumar Kondeti#define gadget_is_ci13xxx_msm(g) (!strcmp("ci13xxx_msm", (g)->name)) 32199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_ci13xxx_pci(g) (!strcmp("ci13xxx_pci", (g)->name)) 33199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_dummy(g) (!strcmp("dummy_udc", (g)->name)) 34500fdf8becb9c8d51970c7ac6a4fa308a5481ebeFelipe Balbi#define gadget_is_dwc3(g) (!strcmp("dwc3-gadget", (g)->name)) 35199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_fsl_qe(g) (!strcmp("fsl_qe_udc", (g)->name)) 36199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_fsl_usb2(g) (!strcmp("fsl-usb2-udc", (g)->name)) 37199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_goku(g) (!strcmp("goku_udc", (g)->name)) 38199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_imx(g) (!strcmp("imx_udc", (g)->name)) 39199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_langwell(g) (!strcmp("langwell_udc", (g)->name)) 40199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_m66592(g) (!strcmp("m66592_udc", (g)->name)) 41199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_musbhdrc(g) (!strcmp("musb-hdrc", (g)->name)) 42199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_net2272(g) (!strcmp("net2272", (g)->name)) 43199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_net2280(g) (!strcmp("net2280", (g)->name)) 44199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_omap(g) (!strcmp("omap_udc", (g)->name)) 45199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_pch(g) (!strcmp("pch_udc", (g)->name)) 46199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_pxa(g) (!strcmp("pxa25x_udc", (g)->name)) 47199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_pxa27x(g) (!strcmp("pxa27x_udc", (g)->name)) 48199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_r8a66597(g) (!strcmp("r8a66597_udc", (g)->name)) 49199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_renesas_usbhs(g) (!strcmp("renesas_usbhs_udc", (g)->name)) 50199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_s3c2410(g) (!strcmp("s3c2410_udc", (g)->name)) 51199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_s3c_hsotg(g) (!strcmp("s3c-hsotg", (g)->name)) 52199e7edbb1b32d237ade354fee24eef5e2cbeb18Felipe Balbi#define gadget_is_s3c_hsudc(g) (!strcmp("s3c-hsudc", (g)->name)) 532f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto 5491e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell/** 5591e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * usb_gadget_controller_number - support bcdDevice id convention 5691e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * @gadget: the controller being driven 5791e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * 5891e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * Return a 2-digit BCD value associated with the peripheral controller, 5991e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * suitable for use as part of a bcdDevice value, or a negative error code. 6091e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * 6191e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * NOTE: this convention is purely optional, and has no meaning in terms of 6291e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * any USB specification. If you want to use a different convention in your 6391e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * gadget driver firmware -- maybe a more formal revision ID -- feel free. 6491e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * 6591e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * Hosts see these bcdDevice numbers, and are allowed (but not encouraged!) 6691e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * to change their behavior accordingly. For example it might help avoiding 6791e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell * some chip bug. 6891e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell */ 6991e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownellstatic inline int usb_gadget_controller_number(struct usb_gadget *gadget) 7091e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell{ 7191e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell if (gadget_is_net2280(gadget)) 7291e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x01; 7391e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_dummy(gadget)) 7491e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x02; 7591e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_pxa(gadget)) 7691e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x03; 7791e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_goku(gadget)) 7891e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x06; 7991e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_omap(gadget)) 8091e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x08; 8191e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_pxa27x(gadget)) 8291e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x11; 8391e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_s3c2410(gadget)) 8491e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x12; 8591e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_at91(gadget)) 8691e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x13; 8791e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell else if (gadget_is_imx(gadget)) 8891e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return 0x14; 891c05ad4447e4ecbd61647c102fb6f2f5a6634ff3David Brownell else if (gadget_is_musbhdrc(gadget)) 901c05ad4447e4ecbd61647c102fb6f2f5a6634ff3David Brownell return 0x16; 9155b3fd41b0846929f68b5fb1058ad8077289f584Haavard Skinnemoen else if (gadget_is_atmel_usba(gadget)) 921f5b9cc9e4cf5847e7550c4079cebb80170e71ddH�vard Skinnemoen return 0x18; 93d2eef1fc99640f7de302dcdbcfbdfcec2eef13f6Li Yang else if (gadget_is_fsl_usb2(gadget)) 94d2eef1fc99640f7de302dcdbcfbdfcec2eef13f6Li Yang return 0x19; 9555d402d854ade6b63b26e958f201ee2ef00b7b15Thomas Dahlmann else if (gadget_is_amd5536udc(gadget)) 9655d402d854ade6b63b26e958f201ee2ef00b7b15Thomas Dahlmann return 0x20; 974cf2503c6801a69fee25030475eceeefb36d1b56Yoshihiro Shimoda else if (gadget_is_m66592(gadget)) 98598f22e11bef8171f2244128bf0341da38fe8a23Yoshihiro Shimoda return 0x21; 993948f0e0c999a6201e9898bb8fbe3c6cc1199276Li Yang else if (gadget_is_fsl_qe(gadget)) 1003948f0e0c999a6201e9898bb8fbe3c6cc1199276Li Yang return 0x22; 101409a15da9851b6e6a5e1c5787be31a987184b7cfPavankumar Kondeti else if (gadget_is_ci13xxx_pci(gadget)) 102aa69a8093ff985873cb44fe1157bd6db29a20fe4David Lopo return 0x23; 1035be19a9daa2df2507adf5b4676a7db8d131cf56eXiaochen Shen else if (gadget_is_langwell(gadget)) 1045be19a9daa2df2507adf5b4676a7db8d131cf56eXiaochen Shen return 0x24; 105c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda else if (gadget_is_r8a66597(gadget)) 106c41442474a26984abaa094e96e42182868eab658Yoshihiro Shimoda return 0x25; 10783ba11d93434e6f0cc2e060336b0b19a3f687fa3Maurus Cuelenaere else if (gadget_is_s3c_hsotg(gadget)) 10883ba11d93434e6f0cc2e060336b0b19a3f687fa3Maurus Cuelenaere return 0x26; 109f646cf94520e22cb11eb5d2e9a35b33bfe4bea1bToshiharu Okada else if (gadget_is_pch(gadget)) 110f646cf94520e22cb11eb5d2e9a35b33bfe4bea1bToshiharu Okada return 0x27; 11133f82f387b9cb27bc903e1368fce88b73213910aPavankumar Kondeti else if (gadget_is_ci13xxx_msm(gadget)) 11233f82f387b9cb27bc903e1368fce88b73213910aPavankumar Kondeti return 0x28; 1132f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto else if (gadget_is_renesas_usbhs(gadget)) 1142f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto return 0x29; 115a9df304cf78d76108196da1ff1dad4d9a5737c2eThomas Abraham else if (gadget_is_s3c_hsudc(gadget)) 116a9df304cf78d76108196da1ff1dad4d9a5737c2eThomas Abraham return 0x30; 117ceb80363b2ec1091dffd78064771e3d4679f69c7Seth Levy else if (gadget_is_net2272(gadget)) 118ceb80363b2ec1091dffd78064771e3d4679f69c7Seth Levy return 0x31; 119500fdf8becb9c8d51970c7ac6a4fa308a5481ebeFelipe Balbi else if (gadget_is_dwc3(gadget)) 120500fdf8becb9c8d51970c7ac6a4fa308a5481ebeFelipe Balbi return 0x32; 1212f98382dcdfe1f0048b447da35f34507ffb514dcKuninori Morimoto 12291e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell return -ENOENT; 12391e79c91fab10f5790159d8d0c1d16da2a9653f9David Brownell} 124da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell 125da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell 126da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell/** 127da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell * gadget_supports_altsettings - return true if altsettings work 128da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell * @gadget: the gadget in question 129da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell */ 130da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownellstatic inline bool gadget_supports_altsettings(struct usb_gadget *gadget) 131da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell{ 132da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell /* PXA 21x/25x/26x has no altsettings at all */ 133da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell if (gadget_is_pxa(gadget)) 134da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell return false; 135da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell 136da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell /* PXA 27x and 3xx have *broken* altsetting support */ 137da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell if (gadget_is_pxa27x(gadget)) 138da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell return false; 139da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell 140da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell /* Everything else is *presumably* fine ... */ 141da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell return true; 142da741b8c56d612b5dd26ffa31341911a5fea23eeDavid Brownell} 143e67d70f2f55d90c79dcb384ad5b798f0f9a68085Felipe Balbi 144e67d70f2f55d90c79dcb384ad5b798f0f9a68085Felipe Balbi#endif /* __GADGET_CHIPS_H */ 145