| .. | .. |
|---|
| 13 | 13 | USB_ROLE_DEVICE, |
|---|
| 14 | 14 | }; |
|---|
| 15 | 15 | |
|---|
| 16 | | -typedef int (*usb_role_switch_set_t)(struct device *dev, enum usb_role role); |
|---|
| 17 | | -typedef enum usb_role (*usb_role_switch_get_t)(struct device *dev); |
|---|
| 16 | +typedef int (*usb_role_switch_set_t)(struct usb_role_switch *sw, |
|---|
| 17 | + enum usb_role role); |
|---|
| 18 | +typedef enum usb_role (*usb_role_switch_get_t)(struct usb_role_switch *sw); |
|---|
| 18 | 19 | |
|---|
| 19 | 20 | /** |
|---|
| 20 | 21 | * struct usb_role_switch_desc - USB Role Switch Descriptor |
|---|
| 22 | + * @fwnode: The device node to be associated with the role switch |
|---|
| 21 | 23 | * @usb2_port: Optional reference to the host controller port device (USB2) |
|---|
| 22 | 24 | * @usb3_port: Optional reference to the host controller port device (USB3) |
|---|
| 23 | 25 | * @udc: Optional reference to the peripheral controller device |
|---|
| 24 | 26 | * @set: Callback for setting the role |
|---|
| 25 | 27 | * @get: Callback for getting the role (optional) |
|---|
| 26 | 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) |
|---|
| 27 | 31 | * |
|---|
| 28 | 32 | * @usb2_port and @usb3_port will point to the USB host port and @udc to the USB |
|---|
| 29 | 33 | * device controller behind the USB connector with the role switch. If |
|---|
| .. | .. |
|---|
| 32 | 36 | * usb_role_switch_register() before registering the switch. |
|---|
| 33 | 37 | */ |
|---|
| 34 | 38 | struct usb_role_switch_desc { |
|---|
| 39 | + struct fwnode_handle *fwnode; |
|---|
| 35 | 40 | struct device *usb2_port; |
|---|
| 36 | 41 | struct device *usb3_port; |
|---|
| 37 | 42 | struct device *udc; |
|---|
| 38 | 43 | usb_role_switch_set_t set; |
|---|
| 39 | 44 | usb_role_switch_get_t get; |
|---|
| 40 | 45 | bool allow_userspace_control; |
|---|
| 46 | + void *driver_data; |
|---|
| 47 | + const char *name; |
|---|
| 41 | 48 | }; |
|---|
| 42 | 49 | |
|---|
| 50 | + |
|---|
| 51 | +#if IS_ENABLED(CONFIG_USB_ROLE_SWITCH) |
|---|
| 43 | 52 | int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role); |
|---|
| 44 | 53 | enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw); |
|---|
| 45 | 54 | struct usb_role_switch *usb_role_switch_get(struct device *dev); |
|---|
| 55 | +struct usb_role_switch *fwnode_usb_role_switch_get(struct fwnode_handle *node); |
|---|
| 46 | 56 | void usb_role_switch_put(struct usb_role_switch *sw); |
|---|
| 57 | + |
|---|
| 58 | +struct usb_role_switch * |
|---|
| 59 | +usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode); |
|---|
| 47 | 60 | |
|---|
| 48 | 61 | struct usb_role_switch * |
|---|
| 49 | 62 | usb_role_switch_register(struct device *parent, |
|---|
| 50 | 63 | const struct usb_role_switch_desc *desc); |
|---|
| 51 | 64 | void usb_role_switch_unregister(struct usb_role_switch *sw); |
|---|
| 52 | 65 | |
|---|
| 66 | +void usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data); |
|---|
| 67 | +void *usb_role_switch_get_drvdata(struct usb_role_switch *sw); |
|---|
| 68 | +#else |
|---|
| 69 | +static inline int usb_role_switch_set_role(struct usb_role_switch *sw, |
|---|
| 70 | + enum usb_role role) |
|---|
| 71 | +{ |
|---|
| 72 | + return 0; |
|---|
| 73 | +} |
|---|
| 74 | + |
|---|
| 75 | +static inline enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw) |
|---|
| 76 | +{ |
|---|
| 77 | + return USB_ROLE_NONE; |
|---|
| 78 | +} |
|---|
| 79 | + |
|---|
| 80 | +static inline struct usb_role_switch *usb_role_switch_get(struct device *dev) |
|---|
| 81 | +{ |
|---|
| 82 | + return ERR_PTR(-ENODEV); |
|---|
| 83 | +} |
|---|
| 84 | + |
|---|
| 85 | +static inline struct usb_role_switch * |
|---|
| 86 | +fwnode_usb_role_switch_get(struct fwnode_handle *node) |
|---|
| 87 | +{ |
|---|
| 88 | + return ERR_PTR(-ENODEV); |
|---|
| 89 | +} |
|---|
| 90 | + |
|---|
| 91 | +static inline void usb_role_switch_put(struct usb_role_switch *sw) { } |
|---|
| 92 | + |
|---|
| 93 | +static inline struct usb_role_switch * |
|---|
| 94 | +usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode) |
|---|
| 95 | +{ |
|---|
| 96 | + return NULL; |
|---|
| 97 | +} |
|---|
| 98 | + |
|---|
| 99 | +static inline struct usb_role_switch * |
|---|
| 100 | +usb_role_switch_register(struct device *parent, |
|---|
| 101 | + const struct usb_role_switch_desc *desc) |
|---|
| 102 | +{ |
|---|
| 103 | + return ERR_PTR(-ENODEV); |
|---|
| 104 | +} |
|---|
| 105 | + |
|---|
| 106 | +static inline void usb_role_switch_unregister(struct usb_role_switch *sw) { } |
|---|
| 107 | + |
|---|
| 108 | +static inline void |
|---|
| 109 | +usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data) |
|---|
| 110 | +{ |
|---|
| 111 | +} |
|---|
| 112 | + |
|---|
| 113 | +static inline void *usb_role_switch_get_drvdata(struct usb_role_switch *sw) |
|---|
| 114 | +{ |
|---|
| 115 | + return NULL; |
|---|
| 116 | +} |
|---|
| 117 | + |
|---|
| 118 | +#endif |
|---|
| 119 | + |
|---|
| 53 | 120 | #endif /* __LINUX_USB_ROLE_H */ |
|---|