diff options
Diffstat (limited to 'include/linux/usb')
-rw-r--r-- | include/linux/usb/otg.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/include/linux/usb/otg.h b/include/linux/usb/otg.h new file mode 100644 index 000000000000..9897f7a818c5 --- /dev/null +++ b/include/linux/usb/otg.h | |||
@@ -0,0 +1,131 @@ | |||
1 | // include/linux/usb/otg.h | ||
2 | |||
3 | /* | ||
4 | * These APIs may be used between USB controllers. USB device drivers | ||
5 | * (for either host or peripheral roles) don't use these calls; they | ||
6 | * continue to use just usb_device and usb_gadget. | ||
7 | */ | ||
8 | |||
9 | |||
10 | /* OTG defines lots of enumeration states before device reset */ | ||
11 | enum usb_otg_state { | ||
12 | OTG_STATE_UNDEFINED = 0, | ||
13 | |||
14 | /* single-role peripheral, and dual-role default-b */ | ||
15 | OTG_STATE_B_IDLE, | ||
16 | OTG_STATE_B_SRP_INIT, | ||
17 | OTG_STATE_B_PERIPHERAL, | ||
18 | |||
19 | /* extra dual-role default-b states */ | ||
20 | OTG_STATE_B_WAIT_ACON, | ||
21 | OTG_STATE_B_HOST, | ||
22 | |||
23 | /* dual-role default-a */ | ||
24 | OTG_STATE_A_IDLE, | ||
25 | OTG_STATE_A_WAIT_VRISE, | ||
26 | OTG_STATE_A_WAIT_BCON, | ||
27 | OTG_STATE_A_HOST, | ||
28 | OTG_STATE_A_SUSPEND, | ||
29 | OTG_STATE_A_PERIPHERAL, | ||
30 | OTG_STATE_A_WAIT_VFALL, | ||
31 | OTG_STATE_A_VBUS_ERR, | ||
32 | }; | ||
33 | |||
34 | /* | ||
35 | * the otg driver needs to interact with both device side and host side | ||
36 | * usb controllers. it decides which controller is active at a given | ||
37 | * moment, using the transceiver, ID signal, HNP and sometimes static | ||
38 | * configuration information (including "board isn't wired for otg"). | ||
39 | */ | ||
40 | struct otg_transceiver { | ||
41 | struct device *dev; | ||
42 | const char *label; | ||
43 | |||
44 | u8 default_a; | ||
45 | enum usb_otg_state state; | ||
46 | |||
47 | struct usb_bus *host; | ||
48 | struct usb_gadget *gadget; | ||
49 | |||
50 | /* to pass extra port status to the root hub */ | ||
51 | u16 port_status; | ||
52 | u16 port_change; | ||
53 | |||
54 | /* bind/unbind the host controller */ | ||
55 | int (*set_host)(struct otg_transceiver *otg, | ||
56 | struct usb_bus *host); | ||
57 | |||
58 | /* bind/unbind the peripheral controller */ | ||
59 | int (*set_peripheral)(struct otg_transceiver *otg, | ||
60 | struct usb_gadget *gadget); | ||
61 | |||
62 | /* effective for B devices, ignored for A-peripheral */ | ||
63 | int (*set_power)(struct otg_transceiver *otg, | ||
64 | unsigned mA); | ||
65 | |||
66 | /* for non-OTG B devices: set transceiver into suspend mode */ | ||
67 | int (*set_suspend)(struct otg_transceiver *otg, | ||
68 | int suspend); | ||
69 | |||
70 | /* for B devices only: start session with A-Host */ | ||
71 | int (*start_srp)(struct otg_transceiver *otg); | ||
72 | |||
73 | /* start or continue HNP role switch */ | ||
74 | int (*start_hnp)(struct otg_transceiver *otg); | ||
75 | |||
76 | }; | ||
77 | |||
78 | |||
79 | /* for board-specific init logic */ | ||
80 | extern int otg_set_transceiver(struct otg_transceiver *); | ||
81 | |||
82 | |||
83 | /* for usb host and peripheral controller drivers */ | ||
84 | extern struct otg_transceiver *otg_get_transceiver(void); | ||
85 | |||
86 | static inline int | ||
87 | otg_start_hnp(struct otg_transceiver *otg) | ||
88 | { | ||
89 | return otg->start_hnp(otg); | ||
90 | } | ||
91 | |||
92 | |||
93 | /* for HCDs */ | ||
94 | static inline int | ||
95 | otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) | ||
96 | { | ||
97 | return otg->set_host(otg, host); | ||
98 | } | ||
99 | |||
100 | |||
101 | /* for usb peripheral controller drivers */ | ||
102 | static inline int | ||
103 | otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph) | ||
104 | { | ||
105 | return otg->set_peripheral(otg, periph); | ||
106 | } | ||
107 | |||
108 | static inline int | ||
109 | otg_set_power(struct otg_transceiver *otg, unsigned mA) | ||
110 | { | ||
111 | return otg->set_power(otg, mA); | ||
112 | } | ||
113 | |||
114 | static inline int | ||
115 | otg_set_suspend(struct otg_transceiver *otg, int suspend) | ||
116 | { | ||
117 | if (otg->set_suspend != NULL) | ||
118 | return otg->set_suspend(otg, suspend); | ||
119 | else | ||
120 | return 0; | ||
121 | } | ||
122 | |||
123 | static inline int | ||
124 | otg_start_srp(struct otg_transceiver *otg) | ||
125 | { | ||
126 | return otg->start_srp(otg); | ||
127 | } | ||
128 | |||
129 | |||
130 | /* for OTG controller drivers (and maybe other stuff) */ | ||
131 | extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); | ||