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/notifier.h> 13 14 /* OTG defines lots of enumeration states before device reset */ 15 enum usb_otg_state { 16 OTG_STATE_UNDEFINED = 0, 17 18 /* single-role peripheral, and dual-role default-b */ 19 OTG_STATE_B_IDLE, 20 OTG_STATE_B_SRP_INIT, 21 OTG_STATE_B_PERIPHERAL, 22 23 /* extra dual-role default-b states */ 24 OTG_STATE_B_WAIT_ACON, 25 OTG_STATE_B_HOST, 26 27 /* dual-role default-a */ 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 38 enum usb_xceiv_events { 39 USB_EVENT_NONE, /* no events or cable disconnected */ 40 USB_EVENT_VBUS, /* vbus valid event */ 41 USB_EVENT_ID, /* id was grounded */ 42 USB_EVENT_CHARGER, /* usb dedicated charger */ 43 USB_EVENT_ENUMERATED, /* gadget driver enumerated */ 44 }; 45 46 struct otg_transceiver; 47 48 /* for transceivers connected thru an ULPI interface, the user must 49 * provide access ops 50 */ 51 struct otg_io_access_ops { 52 int (*read)(struct otg_transceiver *otg, u32 reg); 53 int (*write)(struct otg_transceiver *otg, u32 val, u32 reg); 54 }; 55 56 /* 57 * the otg driver needs to interact with both device side and host side 58 * usb controllers. it decides which controller is active at a given 59 * moment, using the transceiver, ID signal, HNP and sometimes static 60 * configuration information (including "board isn't wired for otg"). 61 */ 62 struct otg_transceiver { 63 struct device *dev; 64 const char *label; 65 unsigned int flags; 66 67 u8 default_a; 68 enum usb_otg_state state; 69 enum usb_xceiv_events last_event; 70 71 struct usb_bus *host; 72 struct usb_gadget *gadget; 73 74 struct otg_io_access_ops *io_ops; 75 void __iomem *io_priv; 76 77 /* for notification of usb_xceiv_events */ 78 struct atomic_notifier_head notifier; 79 80 /* to pass extra port status to the root hub */ 81 u16 port_status; 82 u16 port_change; 83 84 /* initialize/shutdown the OTG controller */ 85 int (*init)(struct otg_transceiver *otg); 86 void (*shutdown)(struct otg_transceiver *otg); 87 88 /* bind/unbind the host controller */ 89 int (*set_host)(struct otg_transceiver *otg, 90 struct usb_bus *host); 91 92 /* bind/unbind the peripheral controller */ 93 int (*set_peripheral)(struct otg_transceiver *otg, 94 struct usb_gadget *gadget); 95 96 /* effective for B devices, ignored for A-peripheral */ 97 int (*set_power)(struct otg_transceiver *otg, 98 unsigned mA); 99 100 /* effective for A-peripheral, ignored for B devices */ 101 int (*set_vbus)(struct otg_transceiver *otg, 102 bool enabled); 103 104 /* for non-OTG B devices: set transceiver into suspend mode */ 105 int (*set_suspend)(struct otg_transceiver *otg, 106 int suspend); 107 108 /* for B devices only: start session with A-Host */ 109 int (*start_srp)(struct otg_transceiver *otg); 110 111 /* start or continue HNP role switch */ 112 int (*start_hnp)(struct otg_transceiver *otg); 113 114 }; 115 116 117 /* for board-specific init logic */ 118 extern int otg_set_transceiver(struct otg_transceiver *); 119 120 #if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE)) 121 /* sometimes transceivers are accessed only through e.g. ULPI */ 122 extern void usb_nop_xceiv_register(void); 123 extern void usb_nop_xceiv_unregister(void); 124 #else 125 static inline void usb_nop_xceiv_register(void) 126 { 127 } 128 129 static inline void usb_nop_xceiv_unregister(void) 130 { 131 } 132 #endif 133 134 /* helpers for direct access thru low-level io interface */ 135 static inline int otg_io_read(struct otg_transceiver *otg, u32 reg) 136 { 137 if (otg->io_ops && otg->io_ops->read) 138 return otg->io_ops->read(otg, reg); 139 140 return -EINVAL; 141 } 142 143 static inline int otg_io_write(struct otg_transceiver *otg, u32 val, u32 reg) 144 { 145 if (otg->io_ops && otg->io_ops->write) 146 return otg->io_ops->write(otg, val, reg); 147 148 return -EINVAL; 149 } 150 151 static inline int 152 otg_init(struct otg_transceiver *otg) 153 { 154 if (otg->init) 155 return otg->init(otg); 156 157 return 0; 158 } 159 160 static inline void 161 otg_shutdown(struct otg_transceiver *otg) 162 { 163 if (otg->shutdown) 164 otg->shutdown(otg); 165 } 166 167 /* for usb host and peripheral controller drivers */ 168 #ifdef CONFIG_USB_OTG_UTILS 169 extern struct otg_transceiver *otg_get_transceiver(void); 170 extern void otg_put_transceiver(struct otg_transceiver *); 171 extern const char *otg_state_string(enum usb_otg_state state); 172 #else 173 static inline struct otg_transceiver *otg_get_transceiver(void) 174 { 175 return NULL; 176 } 177 178 static inline void otg_put_transceiver(struct otg_transceiver *x) 179 { 180 } 181 182 static inline const char *otg_state_string(enum usb_otg_state state) 183 { 184 return NULL; 185 } 186 #endif 187 188 /* Context: can sleep */ 189 static inline int 190 otg_start_hnp(struct otg_transceiver *otg) 191 { 192 return otg->start_hnp(otg); 193 } 194 195 /* Context: can sleep */ 196 static inline int 197 otg_set_vbus(struct otg_transceiver *otg, bool enabled) 198 { 199 return otg->set_vbus(otg, enabled); 200 } 201 202 /* for HCDs */ 203 static inline int 204 otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) 205 { 206 return otg->set_host(otg, host); 207 } 208 209 /* for usb peripheral controller drivers */ 210 211 /* Context: can sleep */ 212 static inline int 213 otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph) 214 { 215 return otg->set_peripheral(otg, periph); 216 } 217 218 static inline int 219 otg_set_power(struct otg_transceiver *otg, unsigned mA) 220 { 221 return otg->set_power(otg, mA); 222 } 223 224 /* Context: can sleep */ 225 static inline int 226 otg_set_suspend(struct otg_transceiver *otg, int suspend) 227 { 228 if (otg->set_suspend != NULL) 229 return otg->set_suspend(otg, suspend); 230 else 231 return 0; 232 } 233 234 static inline int 235 otg_start_srp(struct otg_transceiver *otg) 236 { 237 return otg->start_srp(otg); 238 } 239 240 /* notifiers */ 241 static inline int 242 otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb) 243 { 244 return atomic_notifier_chain_register(&otg->notifier, nb); 245 } 246 247 static inline void 248 otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb) 249 { 250 atomic_notifier_chain_unregister(&otg->notifier, nb); 251 } 252 253 /* for OTG controller drivers (and maybe other stuff) */ 254 extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); 255 256 #endif /* __LINUX_USB_OTG_H */ 257