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 *);
 171#else
 172static inline struct otg_transceiver *otg_get_transceiver(void)
 173{
 174        return NULL;
 175}
 176
 177static inline void otg_put_transceiver(struct otg_transceiver *x)
 178{
 179}
 180#endif
 181
 182/* Context: can sleep */
 183static inline int
 184otg_start_hnp(struct otg_transceiver *otg)
 185{
 186        return otg->start_hnp(otg);
 187}
 188
 189/* Context: can sleep */
 190static inline int
 191otg_set_vbus(struct otg_transceiver *otg, bool enabled)
 192{
 193        return otg->set_vbus(otg, enabled);
 194}
 195
 196/* for HCDs */
 197static inline int
 198otg_set_host(struct otg_transceiver *otg, struct usb_bus *host)
 199{
 200        return otg->set_host(otg, host);
 201}
 202
 203/* for usb peripheral controller drivers */
 204
 205/* Context: can sleep */
 206static inline int
 207otg_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *periph)
 208{
 209        return otg->set_peripheral(otg, periph);
 210}
 211
 212static inline int
 213otg_set_power(struct otg_transceiver *otg, unsigned mA)
 214{
 215        return otg->set_power(otg, mA);
 216}
 217
 218/* Context: can sleep */
 219static inline int
 220otg_set_suspend(struct otg_transceiver *otg, int suspend)
 221{
 222        if (otg->set_suspend != NULL)
 223                return otg->set_suspend(otg, suspend);
 224        else
 225                return 0;
 226}
 227
 228static inline int
 229otg_start_srp(struct otg_transceiver *otg)
 230{
 231        return otg->start_srp(otg);
 232}
 233
 234/* notifiers */
 235static inline int
 236otg_register_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
 237{
 238        return atomic_notifier_chain_register(&otg->notifier, nb);
 239}
 240
 241static inline void
 242otg_unregister_notifier(struct otg_transceiver *otg, struct notifier_block *nb)
 243{
 244        atomic_notifier_chain_unregister(&otg->notifier, nb);
 245}
 246
 247/* for OTG controller drivers (and maybe other stuff) */
 248extern int usb_bus_start_enum(struct usb_bus *bus, unsigned port_num);
 249
 250#endif /* __LINUX_USB_OTG_H */
 251