Commit | Line | Data |
---|---|---|
41dceed5 | 1 | /* USB OTG (On The Go) defines */ |
1da177e4 | 2 | /* |
dda43a0e | 3 | * |
1da177e4 LT |
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 | ||
dda43a0e RD |
9 | #ifndef __LINUX_USB_OTG_H |
10 | #define __LINUX_USB_OTG_H | |
1da177e4 | 11 | |
48bcc180 | 12 | #include <linux/phy/phy.h> |
de4217d9 | 13 | #include <linux/usb/phy.h> |
e9a20171 | 14 | |
7a8a3a9b HK |
15 | struct usb_otg { |
16 | u8 default_a; | |
17 | ||
48bcc180 AT |
18 | struct phy *phy; |
19 | /* old usb_phy interface */ | |
19c1eac2 | 20 | struct usb_phy *usb_phy; |
7a8a3a9b HK |
21 | struct usb_bus *host; |
22 | struct usb_gadget *gadget; | |
23 | ||
e47d9254 AT |
24 | enum usb_otg_state state; |
25 | ||
7a8a3a9b HK |
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 | ||
6a88bbe8 LJ |
44 | /** |
45 | * struct usb_otg_caps - describes the otg capabilities of the device | |
46 | * @otg_rev: The OTG revision number the device is compliant with, it's | |
47 | * in binary-coded decimal (i.e. 2.0 is 0200H). | |
48 | * @hnp_support: Indicates if the device supports HNP. | |
49 | * @srp_support: Indicates if the device supports SRP. | |
50 | * @adp_support: Indicates if the device supports ADP. | |
51 | */ | |
52 | struct usb_otg_caps { | |
53 | u16 otg_rev; | |
54 | bool hnp_support; | |
55 | bool srp_support; | |
56 | bool adp_support; | |
57 | }; | |
58 | ||
42c0bf1c | 59 | extern const char *usb_otg_state_string(enum usb_otg_state state); |
1da177e4 | 60 | |
c2344f13 | 61 | /* Context: can sleep */ |
1da177e4 | 62 | static inline int |
6e13c650 | 63 | otg_start_hnp(struct usb_otg *otg) |
1da177e4 | 64 | { |
6e13c650 HK |
65 | if (otg && otg->start_hnp) |
66 | return otg->start_hnp(otg); | |
7a8a3a9b | 67 | |
136ced89 | 68 | return -ENOTSUPP; |
1da177e4 LT |
69 | } |
70 | ||
91c8a5a9 DM |
71 | /* Context: can sleep */ |
72 | static inline int | |
6e13c650 | 73 | otg_set_vbus(struct usb_otg *otg, bool enabled) |
91c8a5a9 | 74 | { |
6e13c650 HK |
75 | if (otg && otg->set_vbus) |
76 | return otg->set_vbus(otg, enabled); | |
7a8a3a9b | 77 | |
136ced89 | 78 | return -ENOTSUPP; |
91c8a5a9 | 79 | } |
1da177e4 LT |
80 | |
81 | /* for HCDs */ | |
82 | static inline int | |
6e13c650 | 83 | otg_set_host(struct usb_otg *otg, struct usb_bus *host) |
1da177e4 | 84 | { |
6e13c650 HK |
85 | if (otg && otg->set_host) |
86 | return otg->set_host(otg, host); | |
7a8a3a9b | 87 | |
136ced89 | 88 | return -ENOTSUPP; |
1da177e4 LT |
89 | } |
90 | ||
1da177e4 | 91 | /* for usb peripheral controller drivers */ |
c2344f13 RJ |
92 | |
93 | /* Context: can sleep */ | |
1da177e4 | 94 | static inline int |
6e13c650 | 95 | otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph) |
1da177e4 | 96 | { |
6e13c650 HK |
97 | if (otg && otg->set_peripheral) |
98 | return otg->set_peripheral(otg, periph); | |
7a8a3a9b | 99 | |
136ced89 | 100 | return -ENOTSUPP; |
1da177e4 LT |
101 | } |
102 | ||
1da177e4 | 103 | static inline int |
6e13c650 | 104 | otg_start_srp(struct usb_otg *otg) |
1da177e4 | 105 | { |
6e13c650 HK |
106 | if (otg && otg->start_srp) |
107 | return otg->start_srp(otg); | |
7a8a3a9b | 108 | |
136ced89 | 109 | return -ENOTSUPP; |
1da177e4 LT |
110 | } |
111 | ||
1da177e4 LT |
112 | /* for OTG controller drivers (and maybe other stuff) */ |
113 | extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); | |
dda43a0e | 114 | |
1c9af653 MG |
115 | enum usb_dr_mode { |
116 | USB_DR_MODE_UNKNOWN, | |
117 | USB_DR_MODE_HOST, | |
118 | USB_DR_MODE_PERIPHERAL, | |
119 | USB_DR_MODE_OTG, | |
120 | }; | |
121 | ||
06e7114f HK |
122 | /** |
123 | * usb_get_dr_mode - Get dual role mode for given device | |
124 | * @dev: Pointer to the given device | |
125 | * | |
126 | * The function gets phy interface string from property 'dr_mode', | |
127 | * and returns the correspondig enum usb_dr_mode | |
128 | */ | |
129 | extern enum usb_dr_mode usb_get_dr_mode(struct device *dev); | |
130 | ||
dda43a0e | 131 | #endif /* __LINUX_USB_OTG_H */ |