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