Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

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