linux/include/linux/usb/otg.h
<<
>>
Prefs
   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/phy/phy.h>
  13#include <linux/usb/phy.h>
  14
  15struct usb_otg {
  16        u8                      default_a;
  17
  18        struct phy              *phy;
  19        /* old usb_phy interface */
  20        struct usb_phy          *usb_phy;
  21        struct usb_bus          *host;
  22        struct usb_gadget       *gadget;
  23
  24        enum usb_otg_state      state;
  25
  26        /* bind/unbind the host controller */
  27        int     (*set_host)(struct usb_otg *otg, struct usb_bus *host);
  28
  29        /* bind/unbind the peripheral controller */
  30        int     (*set_peripheral)(struct usb_otg *otg,
  31                                        struct usb_gadget *gadget);
  32
  33        /* effective for A-peripheral, ignored for B devices */
  34        int     (*set_vbus)(struct usb_otg *otg, bool enabled);
  35
  36        /* for B devices only:  start session with A-Host */
  37        int     (*start_srp)(struct usb_otg *otg);
  38
  39        /* start or continue HNP role switch */
  40        int     (*start_hnp)(struct usb_otg *otg);
  41
  42};
  43
  44/**
  45 * struct usb_otg_caps - describes the otg capabilities of the device
  46 * @otg_rev: The OTG revision number the device is compliant with, it's
  47 *              in binary-coded decimal (i.e. 2.0 is 0200H).
  48 * @hnp_support: Indicates if the device supports HNP.
  49 * @srp_support: Indicates if the device supports SRP.
  50 * @adp_support: Indicates if the device supports ADP.
  51 */
  52struct usb_otg_caps {
  53        u16 otg_rev;
  54        bool hnp_support;
  55        bool srp_support;
  56        bool adp_support;
  57};
  58
  59extern const char *usb_otg_state_string(enum usb_otg_state state);
  60
  61/* Context: can sleep */
  62static inline int
  63otg_start_hnp(struct usb_otg *otg)
  64{
  65        if (otg && otg->start_hnp)
  66                return otg->start_hnp(otg);
  67
  68        return -ENOTSUPP;
  69}
  70
  71/* Context: can sleep */
  72static inline int
  73otg_set_vbus(struct usb_otg *otg, bool enabled)
  74{
  75        if (otg && otg->set_vbus)
  76                return otg->set_vbus(otg, enabled);
  77
  78        return -ENOTSUPP;
  79}
  80
  81/* for HCDs */
  82static inline int
  83otg_set_host(struct usb_otg *otg, struct usb_bus *host)
  84{
  85        if (otg && otg->set_host)
  86                return otg->set_host(otg, host);
  87
  88        return -ENOTSUPP;
  89}
  90
  91/* for usb peripheral controller drivers */
  92
  93/* Context: can sleep */
  94static inline int
  95otg_set_peripheral(struct usb_otg *otg, struct usb_gadget *periph)
  96{
  97        if (otg && otg->set_peripheral)
  98                return otg->set_peripheral(otg, periph);
  99
 100        return -ENOTSUPP;
 101}
 102
 103static inline int
 104otg_start_srp(struct usb_otg *otg)
 105{
 106        if (otg && otg->start_srp)
 107                return otg->start_srp(otg);
 108
 109        return -ENOTSUPP;
 110}
 111
 112/* for OTG controller drivers (and maybe other stuff) */
 113extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
 114
 115enum usb_dr_mode {
 116        USB_DR_MODE_UNKNOWN,
 117        USB_DR_MODE_HOST,
 118        USB_DR_MODE_PERIPHERAL,
 119        USB_DR_MODE_OTG,
 120};
 121
 122/**
 123 * usb_get_dr_mode - Get dual role mode for given device
 124 * @dev: Pointer to the given device
 125 *
 126 * The function gets phy interface string from property 'dr_mode',
 127 * and returns the correspondig enum usb_dr_mode
 128 */
 129extern enum usb_dr_mode usb_get_dr_mode(struct device *dev);
 130
 131#endif /* __LINUX_USB_OTG_H */
 132