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