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