lkml.org 
[lkml]   [2019]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 4/6] usb: roles: add API to get usb_role_switch by node
    Date
    Add fwnode_usb_role_switch_get() to make easier to get
    usb_role_switch by fwnode which register it.
    It's useful when there is not device_connection registered
    between two drivers and only knows the fwnode which register
    usb_role_switch.

    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    ---
    v4 changes:
    1. use switch_fwnode_match() to find fwnode suggested by Heikki
    2. this patch now depends on [1]

    [1] [v6,08/13] usb: roles: Introduce stubs for the exiting functions in role.h
    https://patchwork.kernel.org/patch/10909971/

    v3 changes:
    1. use fwnodes instead of node suggested by Andy
    2. rebuild the API suggested by Heikki

    v2 no changes
    ---
    drivers/usb/roles/class.c | 25 +++++++++++++++++++++++++
    include/linux/usb/role.h | 8 ++++++++
    2 files changed, 33 insertions(+)

    diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c
    index f45d8df5cfb8..994fcb979795 100644
    --- a/drivers/usb/roles/class.c
    +++ b/drivers/usb/roles/class.c
    @@ -12,6 +12,7 @@
    #include <linux/device.h>
    #include <linux/module.h>
    #include <linux/mutex.h>
    +#include <linux/of.h>
    #include <linux/slab.h>

    static struct class *role_class;
    @@ -135,6 +136,30 @@ struct usb_role_switch *usb_role_switch_get(struct device *dev)
    }
    EXPORT_SYMBOL_GPL(usb_role_switch_get);

    +/**
    + * fwnode_usb_role_switch_get - Find USB role switch by it's parent fwnode
    + * @fwnode: The fwnode that register USB role switch
    + *
    + * Finds and returns role switch registered by @fwnode. The reference count
    + * for the found switch is incremented.
    + */
    +struct usb_role_switch *
    +fwnode_usb_role_switch_get(struct fwnode_handle *fwnode)
    +{
    + struct usb_role_switch *sw;
    + struct device *dev;
    +
    + dev = class_find_device(role_class, NULL, fwnode, switch_fwnode_match);
    + if (!dev)
    + return ERR_PTR(-EPROBE_DEFER);
    +
    + sw = to_role_switch(dev);
    + WARN_ON(!try_module_get(sw->dev.parent->driver->owner));
    +
    + return sw;
    +}
    +EXPORT_SYMBOL_GPL(fwnode_usb_role_switch_get);
    +
    /**
    * usb_role_switch_put - Release handle to a switch
    * @sw: USB Role Switch
    diff --git a/include/linux/usb/role.h b/include/linux/usb/role.h
    index da2b9641b877..35d460f9ec40 100644
    --- a/include/linux/usb/role.h
    +++ b/include/linux/usb/role.h
    @@ -48,6 +48,8 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role);
    enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw);
    struct usb_role_switch *usb_role_switch_get(struct device *dev);
    void usb_role_switch_put(struct usb_role_switch *sw);
    +struct usb_role_switch *
    +fwnode_usb_role_switch_get(struct fwnode_handle *fwnode);

    struct usb_role_switch *
    usb_role_switch_register(struct device *parent,
    @@ -72,6 +74,12 @@ static inline struct usb_role_switch *usb_role_switch_get(struct device *dev)

    static inline void usb_role_switch_put(struct usb_role_switch *sw) { }

    +static inline struct usb_role_switch *
    +fwnode_usb_role_switch_get(struct fwnode_handle *fwnode)
    +{
    + return ERR_PTR(-ENODEV);
    +}
    +
    static inline struct usb_role_switch *
    usb_role_switch_register(struct device *parent,
    const struct usb_role_switch_desc *desc)
    --
    2.21.0
    \
     
     \ /
      Last update: 2019-04-26 08:49    [W:7.054 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site