Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at bb8430a2c8fe2b726033017daadf73c69b0348ea 249 lines 6.0 kB view raw
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 */ 15enum 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 38enum 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 46struct otg_transceiver; 47 48/* for transceivers connected thru an ULPI interface, the user must 49 * provide access ops 50 */ 51struct 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 */ 62struct 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 70 struct usb_bus *host; 71 struct usb_gadget *gadget; 72 73 struct otg_io_access_ops *io_ops; 74 void __iomem *io_priv; 75 76 /* for notification of usb_xceiv_events */ 77 struct blocking_notifier_head notifier; 78 79 /* to pass extra port status to the root hub */ 80 u16 port_status; 81 u16 port_change; 82 83 /* initialize/shutdown the OTG controller */ 84 int (*init)(struct otg_transceiver *otg); 85 void (*shutdown)(struct otg_transceiver *otg); 86 87 /* bind/unbind the host controller */ 88 int (*set_host)(struct otg_transceiver *otg, 89 struct usb_bus *host); 90 91 /* bind/unbind the peripheral controller */ 92 int (*set_peripheral)(struct otg_transceiver *otg, 93 struct usb_gadget *gadget); 94 95 /* effective for B devices, ignored for A-peripheral */ 96 int (*set_power)(struct otg_transceiver *otg, 97 unsigned mA); 98 99 /* effective for A-peripheral, ignored for B devices */ 100 int (*set_vbus)(struct otg_transceiver *otg, 101 bool enabled); 102 103 /* for non-OTG B devices: set transceiver into suspend mode */ 104 int (*set_suspend)(struct otg_transceiver *otg, 105 int suspend); 106 107 /* for B devices only: start session with A-Host */ 108 int (*start_srp)(struct otg_transceiver *otg); 109 110 /* start or continue HNP role switch */ 111 int (*start_hnp)(struct otg_transceiver *otg); 112 113}; 114 115 116/* for board-specific init logic */ 117extern int otg_set_transceiver(struct otg_transceiver *); 118 119#if defined(CONFIG_NOP_USB_XCEIV) || defined(CONFIG_NOP_USB_XCEIV_MODULE) 120/* sometimes transceivers are accessed only through e.g. ULPI */ 121extern void usb_nop_xceiv_register(void); 122extern void usb_nop_xceiv_unregister(void); 123#else 124static inline void usb_nop_xceiv_register(void) 125{ 126} 127 128static inline void usb_nop_xceiv_unregister(void) 129{ 130} 131#endif 132 133/* helpers for direct access thru low-level io interface */ 134static inline int otg_io_read(struct otg_transceiver *otg, u32 reg) 135{ 136 if (otg->io_ops && otg->io_ops->read) 137 return otg->io_ops->read(otg, reg); 138 139 return -EINVAL; 140} 141 142static inline int otg_io_write(struct otg_transceiver *otg, u32 val, u32 reg) 143{ 144 if (otg->io_ops && otg->io_ops->write) 145 return otg->io_ops->write(otg, val, reg); 146 147 return -EINVAL; 148} 149 150static inline int 151otg_init(struct otg_transceiver *otg) 152{ 153 if (otg->init) 154 return otg->init(otg); 155 156 return 0; 157} 158 159static inline void 160otg_shutdown(struct otg_transceiver *otg) 161{ 162 if (otg->shutdown) 163 otg->shutdown(otg); 164} 165 166/* for usb host and peripheral controller drivers */ 167#ifdef CONFIG_USB_OTG_UTILS 168extern struct otg_transceiver *otg_get_transceiver(void); 169extern void otg_put_transceiver(struct otg_transceiver *); 170#else 171static inline struct otg_transceiver *otg_get_transceiver(void) 172{ 173 return NULL; 174} 175 176static inline void otg_put_transceiver(struct otg_transceiver *x) 177{ 178} 179#endif 180 181/* Context: can sleep */ 182static inline int 183otg_start_hnp(struct otg_transceiver *otg) 184{ 185 return otg->start_hnp(otg); 186} 187 188/* Context: can sleep */ 189static inline int 190otg_set_vbus(struct otg_transceiver *otg, bool enabled) 191{ 192 return otg->set_vbus(otg, enabled); 193} 194 195/* for HCDs */ 196static inline int 197otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) 198{ 199 return otg->set_host(otg, host); 200} 201 202/* for usb peripheral controller drivers */ 203 204/* Context: can sleep */ 205static inline int 206otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph) 207{ 208 return otg->set_peripheral(otg, periph); 209} 210 211static inline int 212otg_set_power(struct otg_transceiver *otg, unsigned mA) 213{ 214 return otg->set_power(otg, mA); 215} 216 217/* Context: can sleep */ 218static inline int 219otg_set_suspend(struct otg_transceiver *otg, int suspend) 220{ 221 if (otg->set_suspend != NULL) 222 return otg->set_suspend(otg, suspend); 223 else 224 return 0; 225} 226 227static inline int 228otg_start_srp(struct otg_transceiver *otg) 229{ 230 return otg->start_srp(otg); 231} 232 233/* notifiers */ 234static inline int 235otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb) 236{ 237 return blocking_notifier_chain_register(&otg->notifier, nb); 238} 239 240static inline void 241otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb) 242{ 243 blocking_notifier_chain_unregister(&otg->notifier, nb); 244} 245 246/* for OTG controller drivers (and maybe other stuff) */ 247extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); 248 249#endif /* __LINUX_USB_OTG_H */