diff options
Diffstat (limited to 'kernel/include/linux/usb/otg.h')
-rw-r--r-- | kernel/include/linux/usb/otg.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/kernel/include/linux/usb/otg.h b/kernel/include/linux/usb/otg.h new file mode 100644 index 000000000..52661c5da --- /dev/null +++ b/kernel/include/linux/usb/otg.h @@ -0,0 +1,107 @@ +/* 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/phy/phy.h> +#include <linux/usb/phy.h> + +struct usb_otg { + u8 default_a; + + struct phy *phy; + /* old usb_phy interface */ + struct usb_phy *usb_phy; + struct usb_bus *host; + struct usb_gadget *gadget; + + enum usb_otg_state state; + + /* 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 */ |