linux/include/linux/usb/role.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2
   3#ifndef __LINUX_USB_ROLE_H
   4#define __LINUX_USB_ROLE_H
   5
   6#include <linux/device.h>
   7
   8struct usb_role_switch;
   9
  10enum usb_role {
  11        USB_ROLE_NONE,
  12        USB_ROLE_HOST,
  13        USB_ROLE_DEVICE,
  14};
  15
  16typedef int (*usb_role_switch_set_t)(struct usb_role_switch *sw,
  17                                     enum usb_role role);
  18typedef enum usb_role (*usb_role_switch_get_t)(struct usb_role_switch *sw);
  19
  20/**
  21 * struct usb_role_switch_desc - USB Role Switch Descriptor
  22 * @fwnode: The device node to be associated with the role switch
  23 * @usb2_port: Optional reference to the host controller port device (USB2)
  24 * @usb3_port: Optional reference to the host controller port device (USB3)
  25 * @udc: Optional reference to the peripheral controller device
  26 * @set: Callback for setting the role
  27 * @get: Callback for getting the role (optional)
  28 * @allow_userspace_control: If true userspace may change the role through sysfs
  29 * @driver_data: Private data pointer
  30 * @name: Name for the switch (optional)
  31 *
  32 * @usb2_port and @usb3_port will point to the USB host port and @udc to the USB
  33 * device controller behind the USB connector with the role switch. If
  34 * @usb2_port, @usb3_port and @udc are included in the description, the
  35 * reference count for them should be incremented by the caller of
  36 * usb_role_switch_register() before registering the switch.
  37 */
  38struct usb_role_switch_desc {
  39        struct fwnode_handle *fwnode;
  40        struct device *usb2_port;
  41        struct device *usb3_port;
  42        struct device *udc;
  43        usb_role_switch_set_t set;
  44        usb_role_switch_get_t get;
  45        bool allow_userspace_control;
  46        void *driver_data;
  47        const char *name;
  48};
  49
  50
  51#if IS_ENABLED(CONFIG_USB_ROLE_SWITCH)
  52int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role);
  53enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw);
  54struct usb_role_switch *usb_role_switch_get(struct device *dev);
  55struct usb_role_switch *fwnode_usb_role_switch_get(struct fwnode_handle *node);
  56void usb_role_switch_put(struct usb_role_switch *sw);
  57
  58struct usb_role_switch *
  59usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode);
  60
  61struct usb_role_switch *
  62usb_role_switch_register(struct device *parent,
  63                         const struct usb_role_switch_desc *desc);
  64void usb_role_switch_unregister(struct usb_role_switch *sw);
  65
  66void usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data);
  67void *usb_role_switch_get_drvdata(struct usb_role_switch *sw);
  68const char *usb_role_string(enum usb_role role);
  69#else
  70static inline int usb_role_switch_set_role(struct usb_role_switch *sw,
  71                enum usb_role role)
  72{
  73        return 0;
  74}
  75
  76static inline enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw)
  77{
  78        return USB_ROLE_NONE;
  79}
  80
  81static inline struct usb_role_switch *usb_role_switch_get(struct device *dev)
  82{
  83        return ERR_PTR(-ENODEV);
  84}
  85
  86static inline struct usb_role_switch *
  87fwnode_usb_role_switch_get(struct fwnode_handle *node)
  88{
  89        return ERR_PTR(-ENODEV);
  90}
  91
  92static inline void usb_role_switch_put(struct usb_role_switch *sw) { }
  93
  94static inline struct usb_role_switch *
  95usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode)
  96{
  97        return NULL;
  98}
  99
 100static inline struct usb_role_switch *
 101usb_role_switch_register(struct device *parent,
 102                         const struct usb_role_switch_desc *desc)
 103{
 104        return ERR_PTR(-ENODEV);
 105}
 106
 107static inline void usb_role_switch_unregister(struct usb_role_switch *sw) { }
 108
 109static inline void
 110usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data)
 111{
 112}
 113
 114static inline void *usb_role_switch_get_drvdata(struct usb_role_switch *sw)
 115{
 116        return NULL;
 117}
 118
 119static inline const char *usb_role_string(enum usb_role role)
 120{
 121        return "unknown";
 122}
 123
 124#endif
 125
 126#endif /* __LINUX_USB_ROLE_H */
 127