1 /* USB OTG (On The Go) defines */
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 #ifndef __LINUX_USB_OTG_H
10 #define __LINUX_USB_OTG_H
11 
12 #include <linux/phy/phy.h>
13 #include <linux/usb/phy.h>
14 
15 struct usb_otg {
16 	u8			default_a;
17 
18 	struct phy		*phy;
19 	/* old usb_phy interface */
20 	struct usb_phy		*usb_phy;
21 	struct usb_bus		*host;
22 	struct usb_gadget	*gadget;
23 
24 	enum usb_otg_state	state;
25 
26 	/* bind/unbind the host controller */
27 	int	(*set_host)(struct usb_otg *otg, struct usb_bus *host);
28 
29 	/* bind/unbind the peripheral controller */
30 	int	(*set_peripheral)(struct usb_otg *otg,
31 					struct usb_gadget *gadget);
32 
33 	/* effective for A-peripheral, ignored for B devices */
34 	int	(*set_vbus)(struct usb_otg *otg, bool enabled);
35 
36 	/* for B devices only:  start session with A-Host */
37 	int	(*start_srp)(struct usb_otg *otg);
38 
39 	/* start or continue HNP role switch */
40 	int	(*start_hnp)(struct usb_otg *otg);
41 
42 };
43 
44 extern const char *usb_otg_state_string(enum usb_otg_state state);
45 
46 /* Context: can sleep */
47 static inline int
otg_start_hnp(struct usb_otg * otg)48 otg_start_hnp(struct usb_otg *otg)
49 {
50 	if (otg && otg->start_hnp)
51 		return otg->start_hnp(otg);
52 
53 	return -ENOTSUPP;
54 }
55 
56 /* Context: can sleep */
57 static inline int
otg_set_vbus(struct usb_otg * otg,bool enabled)58 otg_set_vbus(struct usb_otg *otg, bool enabled)
59 {
60 	if (otg && otg->set_vbus)
61 		return otg->set_vbus(otg, enabled);
62 
63 	return -ENOTSUPP;
64 }
65 
66 /* for HCDs */
67 static inline int
otg_set_host(struct usb_otg * otg,struct usb_bus * host)68 otg_set_host(struct usb_otg *otg, struct usb_bus *host)
69 {
70 	if (otg && otg->set_host)
71 		return otg->set_host(otg, host);
72 
73 	return -ENOTSUPP;
74 }
75 
76 /* for usb peripheral controller drivers */
77 
78 /* Context: can sleep */
79 static inline int
otg_set_peripheral(struct usb_otg * otg,struct usb_gadget * periph)80 otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
81 {
82 	if (otg && otg->set_peripheral)
83 		return otg->set_peripheral(otg, periph);
84 
85 	return -ENOTSUPP;
86 }
87 
88 static inline int
otg_start_srp(struct usb_otg * otg)89 otg_start_srp(struct usb_otg *otg)
90 {
91 	if (otg && otg->start_srp)
92 		return otg->start_srp(otg);
93 
94 	return -ENOTSUPP;
95 }
96 
97 /* for OTG controller drivers (and maybe other stuff) */
98 extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
99 
100 enum usb_dr_mode {
101 	USB_DR_MODE_UNKNOWN,
102 	USB_DR_MODE_HOST,
103 	USB_DR_MODE_PERIPHERAL,
104 	USB_DR_MODE_OTG,
105 };
106 
107 #endif /* __LINUX_USB_OTG_H */
108