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