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/notifier.h>
  13
  14/* OTG defines lots of enumeration states before device reset */
  15enum usb_otg_state {
  16        OTG_STATE_UNDEFINED = 0,
  17
  18        /* single-role peripheral, and dual-role default-b */
  19        OTG_STATE_B_IDLE,
  20        OTG_STATE_B_SRP_INIT,
  21        OTG_STATE_B_PERIPHERAL,
  22
  23        /* extra dual-role default-b states */
  24        OTG_STATE_B_WAIT_ACON,
  25        OTG_STATE_B_HOST,
  26
  27        /* dual-role default-a */
  28        OTG_STATE_A_IDLE,
  29        OTG_STATE_A_WAIT_VRISE,
  30        OTG_STATE_A_WAIT_BCON,
  31        OTG_STATE_A_HOST,
  32        OTG_STATE_A_SUSPEND,
  33        OTG_STATE_A_PERIPHERAL,
  34        OTG_STATE_A_WAIT_VFALL,
  35        OTG_STATE_A_VBUS_ERR,
  36};
  37
  38enum usb_xceiv_events {
  39        USB_EVENT_NONE,         /* no events or cable disconnected */
  40        USB_EVENT_VBUS,         /* vbus valid event */
  41        USB_EVENT_ID,           /* id was grounded */
  42        USB_EVENT_CHARGER,      /* usb dedicated charger */
  43        USB_EVENT_ENUMERATED,   /* gadget driver enumerated */
  44};
  45
  46struct otg_transceiver;
  47
  48/* for transceivers connected thru an ULPI interface, the user must
  49 * provide access ops
  50 */
  51struct otg_io_access_ops {
  52        int (*read)(struct otg_transceiver *otg, u32 reg);
  53        int (*write)(struct otg_transceiver *otg, u32 val, u32 reg);
  54};
  55
  56/*
  57 * the otg driver needs to interact with both device side and host side
  58 * usb controllers.  it decides which controller is active at a given
  59 * moment, using the transceiver, ID signal, HNP and sometimes static
  60 * configuration information (including "board isn't wired for otg").
  61 */
  62struct otg_transceiver {
  63        struct device           *dev;
  64        const char              *label;
  65        unsigned int             flags;
  66
  67        u8                      default_a;
  68        enum usb_otg_state      state;
  69        enum usb_xceiv_events   last_event;
  70
  71        struct usb_bus          *host;
  72        struct usb_gadget       *gadget;
  73
  74        struct otg_io_access_ops        *io_ops;
  75        void __iomem                    *io_priv;
  76
  77        /* for notification of usb_xceiv_events */
  78        struct atomic_notifier_head     notifier;
  79
  80        /* to pass extra port status to the root hub */
  81        u16                     port_status;
  82        u16                     port_change;
  83
  84        /* initialize/shutdown the OTG controller */
  85        int     (*init)(struct otg_transceiver *otg);
  86        void    (*shutdown)(struct otg_transceiver *otg);
  87
  88        /* bind/unbind the host controller */
  89        int     (*set_host)(struct otg_transceiver *otg,
  90                                struct usb_bus *host);
  91
  92        /* bind/unbind the peripheral controller */
  93        int     (*set_peripheral)(struct otg_transceiver *otg,
  94                                struct usb_gadget *gadget);
  95
  96        /* effective for B devices, ignored for A-peripheral */
  97        int     (*set_power)(struct otg_transceiver *otg,
  98                                unsigned mA);
  99
 100        /* effective for A-peripheral, ignored for B devices */
 101        int     (*set_vbus)(struct otg_transceiver *otg,
 102                                bool enabled);
 103
 104        /* for non-OTG B devices: set transceiver into suspend mode */
 105        int     (*set_suspend)(struct otg_transceiver *otg,
 106                                int suspend);
 107
 108        /* for B devices only:  start session with A-Host */
 109        int     (*start_srp)(struct otg_transceiver *otg);
 110
 111        /* start or continue HNP role switch */
 112        int     (*start_hnp)(struct otg_transceiver *otg);
 113
 114};
 115
 116
 117/* for board-specific init logic */
 118extern int otg_set_transceiver(struct otg_transceiver *);
 119
 120#if defined(CONFIG_NOP_USB_XCEIV) || (defined(CONFIG_NOP_USB_XCEIV_MODULE) && defined(MODULE))
 121/* sometimes transceivers are accessed only through e.g. ULPI */
 122extern void usb_nop_xceiv_register(void);
 123extern void usb_nop_xceiv_unregister(void);
 124#else
 125static inline void usb_nop_xceiv_register(void)
 126{
 127}
 128
 129static inline void usb_nop_xceiv_unregister(void)
 130{
 131}
 132#endif
 133
 134/* helpers for direct access thru low-level io interface */
 135static inline int otg_io_read(struct otg_transceiver *otg, u32 reg)
 136{
 137        if (otg->io_ops && otg->io_ops->read)
 138                return otg->io_ops->read(otg, reg);
 139
 140        return -EINVAL;
 141}
 142
 143static inline int otg_io_write(struct otg_transceiver *otg, u32 val, u32 reg)
 144{
 145        if (otg->io_ops && otg->io_ops->write)
 146                return otg->io_ops->write(otg, val, reg);
 147
 148        return -EINVAL;
 149}
 150
 151static inline int
 152otg_init(struct otg_transceiver *otg)
 153{
 154        if (otg->init)
 155                return otg->init(otg);
 156
 157        return 0;
 158}
 159
 160static inline void
 161otg_shutdown(struct otg_transceiver *otg)
 162{
 163        if (otg->shutdown)
 164                otg->shutdown(otg);
 165}
 166
 167/* for usb host and peripheral controller drivers */
 168#ifdef CONFIG_USB_OTG_UTILS
 169extern struct otg_transceiver *otg_get_transceiver(void);
 170extern void otg_put_transceiver(struct otg_transceiver *);
 171extern const char *otg_state_string(enum usb_otg_state state);
 172#else
 173static inline struct otg_transceiver *otg_get_transceiver(void)
 174{
 175        return NULL;
 176}
 177
 178static inline void otg_put_transceiver(struct otg_transceiver *x)
 179{
 180}
 181
 182static inline const char *otg_state_string(enum usb_otg_state state)
 183{
 184        return NULL;
 185}
 186#endif
 187
 188/* Context: can sleep */
 189static inline int
 190otg_start_hnp(struct otg_transceiver *otg)
 191{
 192        return otg->start_hnp(otg);
 193}
 194
 195/* Context: can sleep */
 196static inline int
 197otg_set_vbus(struct otg_transceiver *otg, bool enabled)
 198{
 199        return otg->set_vbus(otg, enabled);
 200}
 201
 202/* for HCDs */
 203static inline int
 204otg_set_host(struct otg_transceiver *otg, struct usb_bus *host)
 205{
 206        return otg->set_host(otg, host);
 207}
 208
 209/* for usb peripheral controller drivers */
 210
 211/* Context: can sleep */
 212static inline int
 213otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph)
 214{
 215        return otg->set_peripheral(otg, periph);
 216}
 217
 218static inline int
 219otg_set_power(struct otg_transceiver *otg, unsigned mA)
 220{
 221        return otg->set_power(otg, mA);
 222}
 223
 224/* Context: can sleep */
 225static inline int
 226otg_set_suspend(struct otg_transceiver *otg, int suspend)
 227{
 228        if (otg->set_suspend != NULL)
 229                return otg->set_suspend(otg, suspend);
 230        else
 231                return 0;
 232}
 233
 234static inline int
 235otg_start_srp(struct otg_transceiver *otg)
 236{
 237        return otg->start_srp(otg);
 238}
 239
 240/* notifiers */
 241static inline int
 242otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
 243{
 244        return atomic_notifier_chain_register(&otg->notifier, nb);
 245}
 246
 247static inline void
 248otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
 249{
 250        atomic_notifier_chain_unregister(&otg->notifier, nb);
 251}
 252
 253/* for OTG controller drivers (and maybe other stuff) */
 254extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
 255
 256#endif /* __LINUX_USB_OTG_H */
 257