lkml.org 
[lkml]   [2021]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 16/23] usb: mtu3: support property role-switch-default-mode
    Date
    Support default mode config when use usb-role-switch

    Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
    ---
    drivers/usb/mtu3/mtu3.h | 2 ++
    drivers/usb/mtu3/mtu3_dr.c | 24 ++++++++++++++++++++----
    2 files changed, 22 insertions(+), 4 deletions(-)

    diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h
    index daf2b294ccdf..b56284d28c71 100644
    --- a/drivers/usb/mtu3/mtu3.h
    +++ b/drivers/usb/mtu3/mtu3.h
    @@ -196,6 +196,7 @@ struct mtu3_gpd_ring {
    * @id_nb : notifier for iddig(idpin) detection
    * @dr_work : work for drd mode switch, used to avoid sleep in atomic context
    * @desired_role : role desired to switch
    +* @default_role : default mode while usb role is USB_ROLE_NONE
    * @role_sw : use USB Role Switch to support dual-role switch, can't use
    * extcon at the same time, and extcon is deprecated.
    * @role_sw_used : true when the USB Role Switch is used.
    @@ -209,6 +210,7 @@ struct otg_switch_mtk {
    struct notifier_block id_nb;
    struct work_struct dr_work;
    enum usb_role desired_role;
    + enum usb_role default_role;
    struct usb_role_switch *role_sw;
    bool role_sw_used;
    bool is_u3_drd;
    diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c
    index 318fbc618137..30e7e5fc0f88 100644
    --- a/drivers/usb/mtu3/mtu3_dr.c
    +++ b/drivers/usb/mtu3/mtu3_dr.c
    @@ -137,8 +137,12 @@ static void ssusb_mode_sw_work(struct work_struct *work)

    current_role = ssusb->is_host ? USB_ROLE_HOST : USB_ROLE_DEVICE;

    - if (desired_role == USB_ROLE_NONE)
    + if (desired_role == USB_ROLE_NONE) {
    + /* the default mode is host as probe does */
    desired_role = USB_ROLE_HOST;
    + if (otg_sx->default_role == USB_ROLE_DEVICE)
    + desired_role = USB_ROLE_DEVICE;
    + }

    if (current_role == desired_role)
    return;
    @@ -274,17 +278,29 @@ static int ssusb_role_sw_register(struct otg_switch_mtk *otg_sx)
    {
    struct usb_role_switch_desc role_sx_desc = { 0 };
    struct ssusb_mtk *ssusb = otg_sx_to_ssusb(otg_sx);
    + struct device *dev = ssusb->dev;
    + enum usb_dr_mode mode;

    if (!otg_sx->role_sw_used)
    return 0;

    + mode = usb_get_role_switch_default_mode(dev);
    + if (mode == USB_DR_MODE_PERIPHERAL)
    + otg_sx->default_role = USB_ROLE_DEVICE;
    + else
    + otg_sx->default_role = USB_ROLE_HOST;
    +
    role_sx_desc.set = ssusb_role_sw_set;
    role_sx_desc.get = ssusb_role_sw_get;
    - role_sx_desc.fwnode = dev_fwnode(ssusb->dev);
    + role_sx_desc.fwnode = dev_fwnode(dev);
    role_sx_desc.driver_data = ssusb;
    - otg_sx->role_sw = usb_role_switch_register(ssusb->dev, &role_sx_desc);
    + otg_sx->role_sw = usb_role_switch_register(dev, &role_sx_desc);
    + if (IS_ERR(otg_sx->role_sw))
    + return PTR_ERR(otg_sx->role_sw);

    - return PTR_ERR_OR_ZERO(otg_sx->role_sw);
    + ssusb_set_mode(otg_sx, otg_sx->default_role);
    +
    + return 0;
    }

    int ssusb_otg_switch_init(struct ssusb_mtk *ssusb)
    --
    2.18.0
    \
     
     \ /
      Last update: 2021-06-08 09:59    [W:3.102 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site