at v2.6.21 3.1 kB view raw
1// include/linux/usb/otg.h 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 10/* OTG defines lots of enumeration states before device reset */ 11enum usb_otg_state { 12 OTG_STATE_UNDEFINED = 0, 13 14 /* single-role peripheral, and dual-role default-b */ 15 OTG_STATE_B_IDLE, 16 OTG_STATE_B_SRP_INIT, 17 OTG_STATE_B_PERIPHERAL, 18 19 /* extra dual-role default-b states */ 20 OTG_STATE_B_WAIT_ACON, 21 OTG_STATE_B_HOST, 22 23 /* dual-role default-a */ 24 OTG_STATE_A_IDLE, 25 OTG_STATE_A_WAIT_VRISE, 26 OTG_STATE_A_WAIT_BCON, 27 OTG_STATE_A_HOST, 28 OTG_STATE_A_SUSPEND, 29 OTG_STATE_A_PERIPHERAL, 30 OTG_STATE_A_WAIT_VFALL, 31 OTG_STATE_A_VBUS_ERR, 32}; 33 34/* 35 * the otg driver needs to interact with both device side and host side 36 * usb controllers. it decides which controller is active at a given 37 * moment, using the transceiver, ID signal, HNP and sometimes static 38 * configuration information (including "board isn't wired for otg"). 39 */ 40struct otg_transceiver { 41 struct device *dev; 42 const char *label; 43 44 u8 default_a; 45 enum usb_otg_state state; 46 47 struct usb_bus *host; 48 struct usb_gadget *gadget; 49 50 /* to pass extra port status to the root hub */ 51 u16 port_status; 52 u16 port_change; 53 54 /* bind/unbind the host controller */ 55 int (*set_host)(struct otg_transceiver *otg, 56 struct usb_bus *host); 57 58 /* bind/unbind the peripheral controller */ 59 int (*set_peripheral)(struct otg_transceiver *otg, 60 struct usb_gadget *gadget); 61 62 /* effective for B devices, ignored for A-peripheral */ 63 int (*set_power)(struct otg_transceiver *otg, 64 unsigned mA); 65 66 /* for non-OTG B devices: set transceiver into suspend mode */ 67 int (*set_suspend)(struct otg_transceiver *otg, 68 int suspend); 69 70 /* for B devices only: start session with A-Host */ 71 int (*start_srp)(struct otg_transceiver *otg); 72 73 /* start or continue HNP role switch */ 74 int (*start_hnp)(struct otg_transceiver *otg); 75 76}; 77 78 79/* for board-specific init logic */ 80extern int otg_set_transceiver(struct otg_transceiver *); 81 82 83/* for usb host and peripheral controller drivers */ 84extern struct otg_transceiver *otg_get_transceiver(void); 85 86static inline int 87otg_start_hnp(struct otg_transceiver *otg) 88{ 89 return otg->start_hnp(otg); 90} 91 92 93/* for HCDs */ 94static inline int 95otg_set_host(struct otg_transceiver *otg, struct usb_bus *host) 96{ 97 return otg->set_host(otg, host); 98} 99 100 101/* for usb peripheral controller drivers */ 102static inline int 103otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph) 104{ 105 return otg->set_peripheral(otg, periph); 106} 107 108static inline int 109otg_set_power(struct otg_transceiver *otg, unsigned mA) 110{ 111 return otg->set_power(otg, mA); 112} 113 114static inline int 115otg_set_suspend(struct otg_transceiver *otg, int suspend) 116{ 117 if (otg->set_suspend != NULL) 118 return otg->set_suspend(otg, suspend); 119 else 120 return 0; 121} 122 123static inline int 124otg_start_srp(struct otg_transceiver *otg) 125{ 126 return otg->start_srp(otg); 127} 128 129 130/* for OTG controller drivers (and maybe other stuff) */ 131extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);