diff options
Diffstat (limited to 'include/linux/usb_otg.h')
-rw-r--r-- | include/linux/usb_otg.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/include/linux/usb_otg.h b/include/linux/usb_otg.h new file mode 100644 index 000000000000..c6683146e9b0 --- /dev/null +++ b/include/linux/usb_otg.h | |||
@@ -0,0 +1,118 @@ | |||
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 B devices only: start session with A-Host */ | ||
67 | int (*start_srp)(struct otg_transceiver *otg); | ||
68 | |||
69 | /* start or continue HNP role switch */ | ||
70 | int (*start_hnp)(struct otg_transceiver *otg); | ||
71 | |||
72 | }; | ||
73 | |||
74 | |||
75 | /* for board-specific init logic */ | ||
76 | extern int otg_set_transceiver(struct otg_transceiver *); | ||
77 | |||
78 | |||
79 | /* for usb host and peripheral controller drivers */ | ||
80 | extern struct otg_transceiver *otg_get_transceiver(void); | ||
81 | |||
82 | static inline int | ||
83 | otg_start_hnp(struct otg_transceiver *otg) | ||
84 | { | ||
85 | return otg->start_hnp(otg); | ||
86 | } | ||
87 | |||
88 | |||
89 | /* for HCDs */ | ||
90 | static inline int | ||
91 | otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) | ||
92 | { | ||
93 | return otg->set_host(otg, host); | ||
94 | } | ||
95 | |||
96 | |||
97 | /* for usb peripheral controller drivers */ | ||
98 | static inline int | ||
99 | otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph) | ||
100 | { | ||
101 | return otg->set_peripheral(otg, periph); | ||
102 | } | ||
103 | |||
104 | static inline int | ||
105 | otg_set_power(struct otg_transceiver *otg, unsigned mA) | ||
106 | { | ||
107 | return otg->set_power(otg, mA); | ||
108 | } | ||
109 | |||
110 | static inline int | ||
111 | otg_start_srp(struct otg_transceiver *otg) | ||
112 | { | ||
113 | return otg->start_srp(otg); | ||
114 | } | ||
115 | |||
116 | |||
117 | /* for OTG controller drivers (and maybe other stuff) */ | ||
118 | extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); | ||