|  | /* USB OTG (On The Go) defines */ | 
|  | /* | 
|  | * | 
|  | * These APIs may be used between USB controllers.  USB device drivers | 
|  | * (for either host or peripheral roles) don't use these calls; they | 
|  | * continue to use just usb_device and usb_gadget. | 
|  | */ | 
|  |  | 
|  | #ifndef __LINUX_USB_OTG_H | 
|  | #define __LINUX_USB_OTG_H | 
|  |  | 
|  | #include <linux/usb/phy.h> | 
|  |  | 
|  | struct usb_otg { | 
|  | u8			default_a; | 
|  |  | 
|  | struct usb_phy		*phy; | 
|  | struct usb_bus		*host; | 
|  | struct usb_gadget	*gadget; | 
|  |  | 
|  | /* bind/unbind the host controller */ | 
|  | int	(*set_host)(struct usb_otg *otg, struct usb_bus *host); | 
|  |  | 
|  | /* bind/unbind the peripheral controller */ | 
|  | int	(*set_peripheral)(struct usb_otg *otg, | 
|  | struct usb_gadget *gadget); | 
|  |  | 
|  | /* effective for A-peripheral, ignored for B devices */ | 
|  | int	(*set_vbus)(struct usb_otg *otg, bool enabled); | 
|  |  | 
|  | /* for B devices only:  start session with A-Host */ | 
|  | int	(*start_srp)(struct usb_otg *otg); | 
|  |  | 
|  | /* start or continue HNP role switch */ | 
|  | int	(*start_hnp)(struct usb_otg *otg); | 
|  |  | 
|  | }; | 
|  |  | 
|  | extern const char *usb_otg_state_string(enum usb_otg_state state); | 
|  |  | 
|  | /* Context: can sleep */ | 
|  | static inline int | 
|  | otg_start_hnp(struct usb_otg *otg) | 
|  | { | 
|  | if (otg && otg->start_hnp) | 
|  | return otg->start_hnp(otg); | 
|  |  | 
|  | return -ENOTSUPP; | 
|  | } | 
|  |  | 
|  | /* Context: can sleep */ | 
|  | static inline int | 
|  | otg_set_vbus(struct usb_otg *otg, bool enabled) | 
|  | { | 
|  | if (otg && otg->set_vbus) | 
|  | return otg->set_vbus(otg, enabled); | 
|  |  | 
|  | return -ENOTSUPP; | 
|  | } | 
|  |  | 
|  | /* for HCDs */ | 
|  | static inline int | 
|  | otg_set_host(struct usb_otg *otg, struct usb_bus *host) | 
|  | { | 
|  | if (otg && otg->set_host) | 
|  | return otg->set_host(otg, host); | 
|  |  | 
|  | return -ENOTSUPP; | 
|  | } | 
|  |  | 
|  | /* for usb peripheral controller drivers */ | 
|  |  | 
|  | /* Context: can sleep */ | 
|  | static inline int | 
|  | otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph) | 
|  | { | 
|  | if (otg && otg->set_peripheral) | 
|  | return otg->set_peripheral(otg, periph); | 
|  |  | 
|  | return -ENOTSUPP; | 
|  | } | 
|  |  | 
|  | static inline int | 
|  | otg_start_srp(struct usb_otg *otg) | 
|  | { | 
|  | if (otg && otg->start_srp) | 
|  | return otg->start_srp(otg); | 
|  |  | 
|  | return -ENOTSUPP; | 
|  | } | 
|  |  | 
|  | /* for OTG controller drivers (and maybe other stuff) */ | 
|  | extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num); | 
|  |  | 
|  | enum usb_dr_mode { | 
|  | USB_DR_MODE_UNKNOWN, | 
|  | USB_DR_MODE_HOST, | 
|  | USB_DR_MODE_PERIPHERAL, | 
|  | USB_DR_MODE_OTG, | 
|  | }; | 
|  |  | 
|  | #endif /* __LINUX_USB_OTG_H */ |