1
2
3
4
5
6
7
8
9#ifndef __LINUX_USB_OTG_H
10#define __LINUX_USB_OTG_H
11
12#include <linux/notifier.h>
13
14
15enum usb_otg_state {
16 OTG_STATE_UNDEFINED = 0,
17
18
19 OTG_STATE_B_IDLE,
20 OTG_STATE_B_SRP_INIT,
21 OTG_STATE_B_PERIPHERAL,
22
23
24 OTG_STATE_B_WAIT_ACON,
25 OTG_STATE_B_HOST,
26
27
28 OTG_STATE_A_IDLE,
29 OTG_STATE_A_WAIT_VRISE,
30 OTG_STATE_A_WAIT_BCON,
31 OTG_STATE_A_HOST,
32 OTG_STATE_A_SUSPEND,
33 OTG_STATE_A_PERIPHERAL,
34 OTG_STATE_A_WAIT_VFALL,
35 OTG_STATE_A_VBUS_ERR,
36};
37
38enum usb_xceiv_events {
39 USB_EVENT_NONE,
40 USB_EVENT_VBUS,
41 USB_EVENT_ID,
42 USB_EVENT_CHARGER,
43 USB_EVENT_ENUMERATED,
44};
45
46#define USB_OTG_PULLUP_ID (1 << 0)
47#define USB_OTG_PULLDOWN_DP (1 << 1)
48#define USB_OTG_PULLDOWN_DM (1 << 2)
49#define USB_OTG_EXT_VBUS_INDICATOR (1 << 3)
50#define USB_OTG_DRV_VBUS (1 << 4)
51#define USB_OTG_DRV_VBUS_EXT (1 << 5)
52
53struct otg_transceiver;
54
55
56
57
58struct otg_io_access_ops {
59 int (*read)(struct otg_transceiver *otg, u32 reg);
60 int (*write)(struct otg_transceiver *otg, u32 val, u32 reg);
61};
62
63
64
65
66
67
68
69struct otg_transceiver {
70 struct device *dev;
71 const char *label;
72 unsigned int flags;
73
74 u8 default_a;
75 enum usb_otg_state state;
76
77 struct usb_bus *host;
78 struct usb_gadget *gadget;
79
80 struct otg_io_access_ops *io_ops;
81 void __iomem *io_priv;
82
83
84 struct blocking_notifier_head notifier;
85
86
87 u16 port_status;
88 u16 port_change;
89
90
91 int (*init)(struct otg_transceiver *otg);
92 void (*shutdown)(struct otg_transceiver *otg);
93
94
95 int (*set_host)(struct otg_transceiver *otg,
96 struct usb_bus *host);
97
98
99 int (*set_peripheral)(struct otg_transceiver *otg,
100 struct usb_gadget *gadget);
101
102
103 int (*set_power)(struct otg_transceiver *otg,
104 unsigned mA);
105
106
107 int (*set_vbus)(struct otg_transceiver *otg,
108 bool enabled);
109
110
111 int (*set_suspend)(struct otg_transceiver *otg,
112 int suspend);
113
114
115 int (*start_srp)(struct otg_transceiver *otg);
116
117
118 int (*start_hnp)(struct otg_transceiver *otg);
119
120};
121
122
123
124extern int otg_set_transceiver(struct otg_transceiver *);
125
126#if defined(CONFIG_NOP_USB_XCEIV) || defined(CONFIG_NOP_USB_XCEIV_MODULE)
127
128extern void usb_nop_xceiv_register(void);
129extern void usb_nop_xceiv_unregister(void);
130#else
131static inline void usb_nop_xceiv_register(void)
132{
133}
134
135static inline void usb_nop_xceiv_unregister(void)
136{
137}
138#endif
139
140
141static inline int otg_io_read(struct otg_transceiver *otg, u32 reg)
142{
143 if (otg->io_ops && otg->io_ops->read)
144 return otg->io_ops->read(otg, reg);
145
146 return -EINVAL;
147}
148
149static inline int otg_io_write(struct otg_transceiver *otg, u32 reg, u32 val)
150{
151 if (otg->io_ops && otg->io_ops->write)
152 return otg->io_ops->write(otg, reg, val);
153
154 return -EINVAL;
155}
156
157static inline int
158otg_init(struct otg_transceiver *otg)
159{
160 if (otg->init)
161 return otg->init(otg);
162
163 return 0;
164}
165
166static inline void
167otg_shutdown(struct otg_transceiver *otg)
168{
169 if (otg->shutdown)
170 otg->shutdown(otg);
171}
172
173
174extern struct otg_transceiver *otg_get_transceiver(void);
175extern void otg_put_transceiver(struct otg_transceiver *);
176
177
178static inline int
179otg_start_hnp(struct otg_transceiver *otg)
180{
181 return otg->start_hnp(otg);
182}
183
184
185static inline int
186otg_set_vbus(struct otg_transceiver *otg, bool enabled)
187{
188 return otg->set_vbus(otg, enabled);
189}
190
191
192static inline int
193otg_set_host(struct otg_transceiver *otg, struct usb_bus *host)
194{
195 return otg->set_host(otg, host);
196}
197
198
199
200
201static inline int
202otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph)
203{
204 return otg->set_peripheral(otg, periph);
205}
206
207static inline int
208otg_set_power(struct otg_transceiver *otg, unsigned mA)
209{
210 return otg->set_power(otg, mA);
211}
212
213
214static inline int
215otg_set_suspend(struct otg_transceiver *otg, int suspend)
216{
217 if (otg->set_suspend != NULL)
218 return otg->set_suspend(otg, suspend);
219 else
220 return 0;
221}
222
223static inline int
224otg_start_srp(struct otg_transceiver *otg)
225{
226 return otg->start_srp(otg);
227}
228
229
230static inline int
231otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
232{
233 return blocking_notifier_chain_register(&otg->notifier, nb);
234}
235
236static inline void
237otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
238{
239 blocking_notifier_chain_unregister(&otg->notifier, nb);
240}
241
242
243extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
244
245#endif
246