Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp5649502imb; Thu, 7 Mar 2019 22:16:47 -0800 (PST) X-Google-Smtp-Source: APXvYqyqcDtefs2VksBFSpm0kf7cFSAtytyMUs+rPTrmoF7jnnhSDT5XlKIHOrJuDLmyc0VoDg0Y X-Received: by 2002:a62:ac10:: with SMTP id v16mr17437640pfe.111.1552025807034; Thu, 07 Mar 2019 22:16:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1552025807; cv=none; d=google.com; s=arc-20160816; b=LePlrOmL9DX8kiFFfdElTZ2GWj8y9QVvBW7aLcPnn7nIZLskKEDwK75GVZecbBcrtk GGA7zdEXTM5QCZ/ztoP1GZLJoG2tMBLJ6Bg4B4ZOaaAvSmxPp+t7xR2Ta3KQMa3BvjqI DoTr8m6KVgxnkgdhuO0eC8N8dyuKppk+3kc9VJPwKV0Bc337n9XsMnHqAYRD2xI2XYOz zrxp4NFjLJYvxA93b191Ok0vFXINZG5+xDxfguDQHY8DYgUMCfT1dr9cAbv72hH2pIBf 5AfrUGSEbeIH3uoWcIl+lcD4raImPxV0JO27hYY6HcMLTqpo3b95HeDn5SojU0Zs2UzH yykA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=ulsuJM9avq8iynKO49/EADXg+YxdjahlBUEUecf1lm8=; b=JJ6kqKK3SV99iJSxDuOimz8+Qr/hNN925ovU3st1vtPs7wlbvOZkdGofcBWZp+nrE7 y5xpX6AndDYiBXGqJiLbRpTbxKCdv44VlHE4YbBXZiOcLXfGTh20FO9tMvrz/Bsi9WYF cgq9tLr22kWVAvgjpymdG0gUtc0IWbYmRW5jJcRoyzewLI9dKm4hIr0WcjQBaqfcI+Qv aPaFOxskKk9hM07ZreSxzTJNujX4FQL7JRF2ykiB9IZcjUBvXfwtsTDvi3fN7LYq5dcK elzhWo2DdiyYlt8/89pycAiDDNDKwBljH1/P9zydf1/mqsBe3Qb1uG+f/OGJ9PS/gBqg RtlQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id cm8si6677357plb.47.2019.03.07.22.16.31; Thu, 07 Mar 2019 22:16:47 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726528AbfCHGPn (ORCPT + 99 others); Fri, 8 Mar 2019 01:15:43 -0500 Received: from mailgw02.mediatek.com ([1.203.163.81]:53774 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725372AbfCHGPm (ORCPT ); Fri, 8 Mar 2019 01:15:42 -0500 X-UUID: 916b3d67746d491d91db0385a2908a49-20190308 X-UUID: 916b3d67746d491d91db0385a2908a49-20190308 Received: from mtkcas36.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 767089825; Fri, 08 Mar 2019 14:15:29 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Fri, 8 Mar 2019 14:15:20 +0800 Received: from localhost.localdomain (10.17.3.153) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Fri, 8 Mar 2019 14:15:12 +0800 From: Chunfeng Yun To: Rob Herring , Greg Kroah-Hartman , Heikki Krogerus CC: Mark Rutland , Chunfeng Yun , Matthias Brugger , Adam Thomson , Li Jun , Badhri Jagan Sridharan , Hans de Goede , Andy Shevchenko , Min Guo , , , , , Subject: [PATCH 5/5] usb: mtu3: register a USB Role Switch for Dual-Role mode Date: Fri, 8 Mar 2019 14:13:42 +0800 Message-ID: <1552025622-15582-6-git-send-email-chunfeng.yun@mediatek.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1552025622-15582-1-git-send-email-chunfeng.yun@mediatek.com> References: <1552025622-15582-1-git-send-email-chunfeng.yun@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Due to extcon is not allowed for new bindings, and the Dual-Role switch is supported by USB Role Switch, especially for Type-C drivers, so register a USB Role Switch to support the new way Signed-off-by: Chunfeng Yun --- drivers/usb/mtu3/mtu3.h | 5 ++++ drivers/usb/mtu3/mtu3_dr.c | 50 +++++++++++++++++++++++++++++++++--- drivers/usb/mtu3/mtu3_plat.c | 3 ++- 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h index 87823ac0d120..8f9da03255b6 100644 --- a/drivers/usb/mtu3/mtu3.h +++ b/drivers/usb/mtu3/mtu3.h @@ -202,6 +202,9 @@ struct mtu3_gpd_ring { * @id_nb : notifier for iddig(idpin) detection * @id_work : work of iddig detection notifier * @id_event : event of iddig detecion notifier +* @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. * @is_u3_drd: whether port0 supports usb3.0 dual-role device or not * @manual_drd_enabled: it's true when supports dual-role device by debugfs * to switch host/device modes depending on user input. @@ -215,6 +218,8 @@ struct otg_switch_mtk { struct notifier_block id_nb; struct work_struct id_work; unsigned long id_event; + struct usb_role_switch *role_sw; + bool role_sw_used; bool is_u3_drd; bool manual_drd_enabled; }; diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c index ac60e9c8564e..b9272295fe2b 100644 --- a/drivers/usb/mtu3/mtu3_dr.c +++ b/drivers/usb/mtu3/mtu3_dr.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "mtu3.h" #include "mtu3_dr.h" @@ -266,7 +267,7 @@ static int ssusb_extcon_register(struct otg_switch_mtk *otg_sx) * This is useful in special cases, such as uses TYPE-A receptacle but also * wants to support dual-role mode. */ -static void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) +static void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) { struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; @@ -308,9 +309,9 @@ static ssize_t ssusb_mode_write(struct file *file, return -EFAULT; if (!strncmp(buf, "host", 4) && !ssusb->is_host) { - ssusb_mode_manual_switch(ssusb, 1); + ssusb_mode_switch(ssusb, 1); } else if (!strncmp(buf, "device", 6) && ssusb->is_host) { - ssusb_mode_manual_switch(ssusb, 0); + ssusb_mode_switch(ssusb, 0); } else { dev_err(ssusb->dev, "wrong or duplicated setting\n"); return -EINVAL; @@ -412,6 +413,46 @@ void ssusb_set_force_mode(struct ssusb_mtk *ssusb, mtu3_writel(ssusb->ippc_base, SSUSB_U2_CTRL(0), value); } +static int ssusb_role_sw_set(struct device *dev, enum usb_role role) +{ + struct ssusb_mtk *ssusb = dev_get_drvdata(dev); + bool to_host = false; + + if (role == USB_ROLE_HOST) + to_host = true; + + if (to_host ^ ssusb->is_host) + ssusb_mode_switch(ssusb, to_host); + + return 0; +} + +static enum usb_role ssusb_role_sw_get(struct device *dev) +{ + struct ssusb_mtk *ssusb = dev_get_drvdata(dev); + enum usb_role role; + + role = ssusb->is_host ? USB_ROLE_HOST : USB_ROLE_DEVICE; + + return role; +} + +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 = + container_of(otg_sx, struct ssusb_mtk, otg_switch); + + if (!otg_sx->role_sw_used) + return 0; + + role_sx_desc.set = ssusb_role_sw_set; + role_sx_desc.get = ssusb_role_sw_get; + otg_sx->role_sw = usb_role_switch_register(ssusb->dev, &role_sx_desc); + + return PTR_ERR_OR_ZERO(otg_sx->role_sw); +} + int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) { struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; @@ -421,6 +462,8 @@ int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) if (otg_sx->manual_drd_enabled) ssusb_debugfs_init(ssusb); + else if (otg_sx->role_sw_used) + ssusb_role_sw_register(otg_sx); else ssusb_extcon_register(otg_sx); @@ -436,4 +479,5 @@ void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb) cancel_work_sync(&otg_sx->id_work); cancel_work_sync(&otg_sx->vbus_work); + usb_role_switch_unregister(otg_sx->role_sw); } diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c index e086630e41a9..02c288a85989 100644 --- a/drivers/usb/mtu3/mtu3_plat.c +++ b/drivers/usb/mtu3/mtu3_plat.c @@ -313,8 +313,9 @@ static int get_ssusb_rscs(struct platform_device *pdev, struct ssusb_mtk *ssusb) otg_sx->is_u3_drd = of_property_read_bool(node, "mediatek,usb3-drd"); otg_sx->manual_drd_enabled = of_property_read_bool(node, "enable-manual-drd"); + otg_sx->role_sw_used = of_property_read_bool(node, "usb-role-switch"); - if (of_property_read_bool(node, "extcon")) { + if (!otg_sx->role_sw_used && of_property_read_bool(node, "extcon")) { otg_sx->edev = extcon_get_edev_by_phandle(ssusb->dev, 0); if (IS_ERR(otg_sx->edev)) { dev_err(ssusb->dev, "couldn't get extcon device\n"); -- 2.20.1