Re: [PATCH 4/9] usb: roles: Leave the private driver data pointer to the drivers
From: Chunfeng Yun
Date: Sat Feb 15 2020 - 04:21:12 EST
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 */