On Thu, 2020-02-13 at 16:24 +0300, Heikki Krogerus wrote: > Adding usb_role_switch_get/set_drvdata() functions that the > switch drivers can use for setting and getting private data > pointer that is associated with the switch. > > Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > --- > drivers/usb/roles/class.c | 22 ++++++++++++++++++++++ > include/linux/usb/role.h | 16 ++++++++++++++++ > 2 files changed, 38 insertions(+) > > diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c > index 63a00ff26655..f3132d231599 100644 > --- a/drivers/usb/roles/class.c > +++ b/drivers/usb/roles/class.c > @@ -329,6 +329,7 @@ usb_role_switch_register(struct device *parent, > sw->dev.fwnode = desc->fwnode; > sw->dev.class = role_class; > sw->dev.type = &usb_role_dev_type; > + sw->dev.driver_data = desc->driver_data; How about use dev_set_drvdata()? will keep align with usb_role_switch_set/get_drvdata(), > dev_set_name(&sw->dev, "%s-role-switch", dev_name(parent)); > > ret = device_register(&sw->dev); > @@ -356,6 +357,27 @@ void usb_role_switch_unregister(struct usb_role_switch *sw) > } > EXPORT_SYMBOL_GPL(usb_role_switch_unregister); > > +/** > + * usb_role_switch_set_drvdata - Assign private data pointer to a switch > + * @sw: USB Role Switch > + * @data: Private data pointer > + */ > +void usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data) > +{ > + dev_set_drvdata(&sw->dev, data); > +} > +EXPORT_SYMBOL_GPL(usb_role_switch_set_drvdata); > + > +/** > + * usb_role_switch_get_drvdata - Get the private data pointer of a switch > + * @sw: USB Role Switch > + */ > +void *usb_role_switch_get_drvdata(struct usb_role_switch *sw) > +{ > + return dev_get_drvdata(&sw->dev); > +} > +EXPORT_SYMBOL_GPL(usb_role_switch_get_drvdata); > + > static int __init usb_roles_init(void) > { > role_class = class_create(THIS_MODULE, "usb_role"); > diff --git a/include/linux/usb/role.h b/include/linux/usb/role.h > index efac3af83d6b..02dae936cebd 100644 > --- a/include/linux/usb/role.h > +++ b/include/linux/usb/role.h > @@ -25,6 +25,7 @@ typedef enum usb_role (*usb_role_switch_get_t)(struct device *dev); > * @set: Callback for setting the role > * @get: Callback for getting the role (optional) > * @allow_userspace_control: If true userspace may change the role through sysfs > + * @driver_data: Private data pointer > * > * @usb2_port and @usb3_port will point to the USB host port and @udc to the USB > * device controller behind the USB connector with the role switch. If > @@ -40,6 +41,7 @@ struct usb_role_switch_desc { > usb_role_switch_set_t set; > usb_role_switch_get_t get; > bool allow_userspace_control; > + void *driver_data; > }; > > > @@ -57,6 +59,9 @@ struct usb_role_switch * > usb_role_switch_register(struct device *parent, > const struct usb_role_switch_desc *desc); > void usb_role_switch_unregister(struct usb_role_switch *sw); > + > +void usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data); > +void *usb_role_switch_get_drvdata(struct usb_role_switch *sw); > #else > static inline int usb_role_switch_set_role(struct usb_role_switch *sw, > enum usb_role role) > @@ -90,6 +95,17 @@ usb_role_switch_register(struct device *parent, > } > > static inline void usb_role_switch_unregister(struct usb_role_switch *sw) { } > + > +static inline void > +usb_role_switch_set_drvdata(struct usb_role_switch *sw, void *data) > +{ > +} > + > +static inline void *usb_role_switch_get_drvdata(struct usb_role_switch *sw) > +{ > + return NULL; > +} > + > #endif > > #endif /* __LINUX_USB_ROLE_H */