From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AAEC7C4360F for ; Wed, 3 Apr 2019 02:10:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 720A22146E for ; Wed, 3 Apr 2019 02:10:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727214AbfDCCKG (ORCPT ); Tue, 2 Apr 2019 22:10:06 -0400 Received: from mailgw02.mediatek.com ([1.203.163.81]:10898 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726089AbfDCCKC (ORCPT ); Tue, 2 Apr 2019 22:10:02 -0400 X-UUID: d016bf0a0ea64286ba18c7833725ad42-20190403 X-UUID: d016bf0a0ea64286ba18c7833725ad42-20190403 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw02.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLS) with ESMTP id 2027854424; Wed, 03 Apr 2019 10:09:55 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 3 Apr 2019 10:09:53 +0800 Received: from localhost.localdomain (10.17.3.153) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 3 Apr 2019 10:09:48 +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 , Alan Stern , , , , , Subject: [v3 PATCH 6/6] usb: mtu3: register a USB Role Switch for dual role mode Date: Wed, 3 Apr 2019 10:09:14 +0800 Message-ID: <1554257354-7440-7-git-send-email-chunfeng.yun@mediatek.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1554257354-7440-1-git-send-email-chunfeng.yun@mediatek.com> References: <1554257354-7440-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 Because 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 --- v3 changes: 1. select USB_ROLE_SWITCH in Kconfig suggested by Heikki 2. rename ssusb_mode_manual_switch() to ssusb_mode_switch() v2 no change --- drivers/usb/mtu3/Kconfig | 1 + drivers/usb/mtu3/mtu3.h | 5 ++++ drivers/usb/mtu3/mtu3_debugfs.c | 4 +-- drivers/usb/mtu3/mtu3_dr.c | 47 ++++++++++++++++++++++++++++++++- drivers/usb/mtu3/mtu3_dr.h | 6 ++--- drivers/usb/mtu3/mtu3_plat.c | 3 ++- 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/drivers/usb/mtu3/Kconfig b/drivers/usb/mtu3/Kconfig index bcc23486c4ed..88e3db7b3016 100644 --- a/drivers/usb/mtu3/Kconfig +++ b/drivers/usb/mtu3/Kconfig @@ -43,6 +43,7 @@ config USB_MTU3_DUAL_ROLE bool "Dual Role mode" depends on ((USB=y || USB=USB_MTU3) && (USB_GADGET=y || USB_GADGET=USB_MTU3)) depends on (EXTCON=y || EXTCON=USB_MTU3) + select USB_ROLE_SWITCH help This is the default mode of working of MTU3 controller where both host and gadget features are enabled. diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h index 76ecf12fdf62..6087be236a35 100644 --- a/drivers/usb/mtu3/mtu3.h +++ b/drivers/usb/mtu3/mtu3.h @@ -199,6 +199,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. @@ -212,6 +215,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_debugfs.c b/drivers/usb/mtu3/mtu3_debugfs.c index 62c57ddc554e..c96e5dab0a48 100644 --- a/drivers/usb/mtu3/mtu3_debugfs.c +++ b/drivers/usb/mtu3/mtu3_debugfs.c @@ -453,9 +453,9 @@ static ssize_t ssusb_mode_write(struct file *file, const char __user *ubuf, 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; diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c index 5fcb71af875a..5f20141dd57f 100644 --- a/drivers/usb/mtu3/mtu3_dr.c +++ b/drivers/usb/mtu3/mtu3_dr.c @@ -7,6 +7,8 @@ * Author: Chunfeng Yun */ +#include + #include "mtu3.h" #include "mtu3_dr.h" #include "mtu3_debug.h" @@ -280,7 +282,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. */ -void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) +void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) { struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; @@ -318,6 +320,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; @@ -328,6 +370,8 @@ int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) if (otg_sx->manual_drd_enabled) ssusb_dr_debugfs_init(ssusb); + else if (otg_sx->role_sw_used) + ret = ssusb_role_sw_register(otg_sx); else ret = ssusb_extcon_register(otg_sx); @@ -340,4 +384,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_dr.h b/drivers/usb/mtu3/mtu3_dr.h index ba6fe357ce29..5e58c4dbd54a 100644 --- a/drivers/usb/mtu3/mtu3_dr.h +++ b/drivers/usb/mtu3/mtu3_dr.h @@ -71,7 +71,7 @@ static inline void ssusb_gadget_exit(struct ssusb_mtk *ssusb) #if IS_ENABLED(CONFIG_USB_MTU3_DUAL_ROLE) int ssusb_otg_switch_init(struct ssusb_mtk *ssusb); void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb); -void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host); +void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host); int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on); void ssusb_set_force_mode(struct ssusb_mtk *ssusb, enum mtu3_dr_force_mode mode); @@ -86,8 +86,8 @@ static inline int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) static inline void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb) {} -static inline void -ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) {} +static inline void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) +{} static inline int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on) { diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c index fd0f6c5dfbc1..9c256ea3cdf5 100644 --- a/drivers/usb/mtu3/mtu3_plat.c +++ b/drivers/usb/mtu3/mtu3_plat.c @@ -299,8 +299,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 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chunfeng Yun Subject: [v3 PATCH 6/6] usb: mtu3: register a USB Role Switch for dual role mode Date: Wed, 3 Apr 2019 10:09:14 +0800 Message-ID: <1554257354-7440-7-git-send-email-chunfeng.yun@mediatek.com> References: <1554257354-7440-1-git-send-email-chunfeng.yun@mediatek.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1554257354-7440-1-git-send-email-chunfeng.yun@mediatek.com> Sender: linux-kernel-owner@vger.kernel.org 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 , Alan Stern , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org List-Id: devicetree@vger.kernel.org Because 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 --- v3 changes: 1. select USB_ROLE_SWITCH in Kconfig suggested by Heikki 2. rename ssusb_mode_manual_switch() to ssusb_mode_switch() v2 no change --- drivers/usb/mtu3/Kconfig | 1 + drivers/usb/mtu3/mtu3.h | 5 ++++ drivers/usb/mtu3/mtu3_debugfs.c | 4 +-- drivers/usb/mtu3/mtu3_dr.c | 47 ++++++++++++++++++++++++++++++++- drivers/usb/mtu3/mtu3_dr.h | 6 ++--- drivers/usb/mtu3/mtu3_plat.c | 3 ++- 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/drivers/usb/mtu3/Kconfig b/drivers/usb/mtu3/Kconfig index bcc23486c4ed..88e3db7b3016 100644 --- a/drivers/usb/mtu3/Kconfig +++ b/drivers/usb/mtu3/Kconfig @@ -43,6 +43,7 @@ config USB_MTU3_DUAL_ROLE bool "Dual Role mode" depends on ((USB=y || USB=USB_MTU3) && (USB_GADGET=y || USB_GADGET=USB_MTU3)) depends on (EXTCON=y || EXTCON=USB_MTU3) + select USB_ROLE_SWITCH help This is the default mode of working of MTU3 controller where both host and gadget features are enabled. diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h index 76ecf12fdf62..6087be236a35 100644 --- a/drivers/usb/mtu3/mtu3.h +++ b/drivers/usb/mtu3/mtu3.h @@ -199,6 +199,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. @@ -212,6 +215,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_debugfs.c b/drivers/usb/mtu3/mtu3_debugfs.c index 62c57ddc554e..c96e5dab0a48 100644 --- a/drivers/usb/mtu3/mtu3_debugfs.c +++ b/drivers/usb/mtu3/mtu3_debugfs.c @@ -453,9 +453,9 @@ static ssize_t ssusb_mode_write(struct file *file, const char __user *ubuf, 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; diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c index 5fcb71af875a..5f20141dd57f 100644 --- a/drivers/usb/mtu3/mtu3_dr.c +++ b/drivers/usb/mtu3/mtu3_dr.c @@ -7,6 +7,8 @@ * Author: Chunfeng Yun */ +#include + #include "mtu3.h" #include "mtu3_dr.h" #include "mtu3_debug.h" @@ -280,7 +282,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. */ -void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) +void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) { struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; @@ -318,6 +320,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; @@ -328,6 +370,8 @@ int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) if (otg_sx->manual_drd_enabled) ssusb_dr_debugfs_init(ssusb); + else if (otg_sx->role_sw_used) + ret = ssusb_role_sw_register(otg_sx); else ret = ssusb_extcon_register(otg_sx); @@ -340,4 +384,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_dr.h b/drivers/usb/mtu3/mtu3_dr.h index ba6fe357ce29..5e58c4dbd54a 100644 --- a/drivers/usb/mtu3/mtu3_dr.h +++ b/drivers/usb/mtu3/mtu3_dr.h @@ -71,7 +71,7 @@ static inline void ssusb_gadget_exit(struct ssusb_mtk *ssusb) #if IS_ENABLED(CONFIG_USB_MTU3_DUAL_ROLE) int ssusb_otg_switch_init(struct ssusb_mtk *ssusb); void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb); -void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host); +void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host); int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on); void ssusb_set_force_mode(struct ssusb_mtk *ssusb, enum mtu3_dr_force_mode mode); @@ -86,8 +86,8 @@ static inline int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) static inline void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb) {} -static inline void -ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) {} +static inline void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) +{} static inline int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on) { diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c index fd0f6c5dfbc1..9c256ea3cdf5 100644 --- a/drivers/usb/mtu3/mtu3_plat.c +++ b/drivers/usb/mtu3/mtu3_plat.c @@ -299,8 +299,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 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3,6/6] usb: mtu3: register a USB Role Switch for dual role mode From: Chunfeng Yun Message-Id: <1554257354-7440-7-git-send-email-chunfeng.yun@mediatek.com> Date: Wed, 3 Apr 2019 10:09:14 +0800 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 , Alan Stern , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org List-ID: QmVjYXVzZSBleHRjb24gaXMgbm90IGFsbG93ZWQgZm9yIG5ldyBiaW5kaW5ncywgYW5kIHRoZQpk dWFsIHJvbGUgc3dpdGNoIGlzIHN1cHBvcnRlZCBieSBVU0IgUm9sZSBTd2l0Y2gsCmVzcGVjaWFs bHkgZm9yIFR5cGUtQyBkcml2ZXJzLCBzbyByZWdpc3RlciBhIFVTQiBSb2xlClN3aXRjaCB0byBz dXBwb3J0IHRoZSBuZXcgd2F5CgpTaWduZWQtb2ZmLWJ5OiBDaHVuZmVuZyBZdW4gPGNodW5mZW5n Lnl1bkBtZWRpYXRlay5jb20+Ci0tLQp2MyBjaGFuZ2VzOgogIDEuIHNlbGVjdCBVU0JfUk9MRV9T V0lUQ0ggaW4gS2NvbmZpZyBzdWdnZXN0ZWQgYnkgSGVpa2tpCiAgMi4gcmVuYW1lIHNzdXNiX21v ZGVfbWFudWFsX3N3aXRjaCgpIHRvIHNzdXNiX21vZGVfc3dpdGNoKCkKCnYyIG5vIGNoYW5nZQot LS0KIGRyaXZlcnMvdXNiL210dTMvS2NvbmZpZyAgICAgICAgfCAgMSArCiBkcml2ZXJzL3VzYi9t dHUzL210dTMuaCAgICAgICAgIHwgIDUgKysrKwogZHJpdmVycy91c2IvbXR1My9tdHUzX2RlYnVn ZnMuYyB8ICA0ICstLQogZHJpdmVycy91c2IvbXR1My9tdHUzX2RyLmMgICAgICB8IDQ3ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrLQogZHJpdmVycy91c2IvbXR1My9tdHUzX2RyLmgg ICAgICB8ICA2ICsrLS0tCiBkcml2ZXJzL3VzYi9tdHUzL210dTNfcGxhdC5jICAgIHwgIDMgKyst CiA2IGZpbGVzIGNoYW5nZWQsIDU5IGluc2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvbXR1My9LY29uZmlnIGIvZHJpdmVycy91c2IvbXR1My9LY29u ZmlnCmluZGV4IGJjYzIzNDg2YzRlZC4uODhlM2RiN2IzMDE2IDEwMDY0NAotLS0gYS9kcml2ZXJz L3VzYi9tdHUzL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXR1My9LY29uZmlnCkBAIC00Myw2 ICs0Myw3IEBAIGNvbmZpZyBVU0JfTVRVM19EVUFMX1JPTEUKIAlib29sICJEdWFsIFJvbGUgbW9k ZSIKIAlkZXBlbmRzIG9uICgoVVNCPXkgfHwgVVNCPVVTQl9NVFUzKSAmJiAoVVNCX0dBREdFVD15 IHx8IFVTQl9HQURHRVQ9VVNCX01UVTMpKQogCWRlcGVuZHMgb24gKEVYVENPTj15IHx8IEVYVENP Tj1VU0JfTVRVMykKKwlzZWxlY3QgVVNCX1JPTEVfU1dJVENICiAJaGVscAogCSAgVGhpcyBpcyB0 aGUgZGVmYXVsdCBtb2RlIG9mIHdvcmtpbmcgb2YgTVRVMyBjb250cm9sbGVyIHdoZXJlCiAJICBi b3RoIGhvc3QgYW5kIGdhZGdldCBmZWF0dXJlcyBhcmUgZW5hYmxlZC4KZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL210dTMvbXR1My5oIGIvZHJpdmVycy91c2IvbXR1My9tdHUzLmgKaW5kZXggNzZl Y2YxMmZkZjYyLi42MDg3YmUyMzZhMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL210dTMvbXR1 My5oCisrKyBiL2RyaXZlcnMvdXNiL210dTMvbXR1My5oCkBAIC0xOTksNiArMTk5LDkgQEAgc3Ry dWN0IG10dTNfZ3BkX3JpbmcgewogKiBAaWRfbmIgOiBub3RpZmllciBmb3IgaWRkaWcoaWRwaW4p IGRldGVjdGlvbgogKiBAaWRfd29yayA6IHdvcmsgb2YgaWRkaWcgZGV0ZWN0aW9uIG5vdGlmaWVy CiAqIEBpZF9ldmVudCA6IGV2ZW50IG9mIGlkZGlnIGRldGVjaW9uIG5vdGlmaWVyCisqIEByb2xl X3N3IDogdXNlIFVTQiBSb2xlIFN3aXRjaCB0byBzdXBwb3J0IGR1YWwtcm9sZSBzd2l0Y2gsIGNh bid0IHVzZQorKgkJZXh0Y29uIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBleHRjb24gaXMgZGVwcmVj YXRlZC4KKyogQHJvbGVfc3dfdXNlZCA6IHRydWUgd2hlbiB0aGUgVVNCIFJvbGUgU3dpdGNoIGlz IHVzZWQuCiAqIEBpc191M19kcmQ6IHdoZXRoZXIgcG9ydDAgc3VwcG9ydHMgdXNiMy4wIGR1YWwt cm9sZSBkZXZpY2Ugb3Igbm90CiAqIEBtYW51YWxfZHJkX2VuYWJsZWQ6IGl0J3MgdHJ1ZSB3aGVu IHN1cHBvcnRzIGR1YWwtcm9sZSBkZXZpY2UgYnkgZGVidWdmcwogKgkJdG8gc3dpdGNoIGhvc3Qv ZGV2aWNlIG1vZGVzIGRlcGVuZGluZyBvbiB1c2VyIGlucHV0LgpAQCAtMjEyLDYgKzIxNSw4IEBA IHN0cnVjdCBvdGdfc3dpdGNoX210ayB7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlkX25iOwog CXN0cnVjdCB3b3JrX3N0cnVjdCBpZF93b3JrOwogCXVuc2lnbmVkIGxvbmcgaWRfZXZlbnQ7CisJ c3RydWN0IHVzYl9yb2xlX3N3aXRjaCAqcm9sZV9zdzsKKwlib29sIHJvbGVfc3dfdXNlZDsKIAli b29sIGlzX3UzX2RyZDsKIAlib29sIG1hbnVhbF9kcmRfZW5hYmxlZDsKIH07CmRpZmYgLS1naXQg YS9kcml2ZXJzL3VzYi9tdHUzL210dTNfZGVidWdmcy5jIGIvZHJpdmVycy91c2IvbXR1My9tdHUz X2RlYnVnZnMuYwppbmRleCA2MmM1N2RkYzU1NGUuLmM5NmU1ZGFiMGE0OCAxMDA2NDQKLS0tIGEv ZHJpdmVycy91c2IvbXR1My9tdHUzX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3VzYi9tdHUzL210 dTNfZGVidWdmcy5jCkBAIC00NTMsOSArNDUzLDkgQEAgc3RhdGljIHNzaXplX3Qgc3N1c2JfbW9k ZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCiAJCXJl dHVybiAtRUZBVUxUOwogCiAJaWYgKCFzdHJuY21wKGJ1ZiwgImhvc3QiLCA0KSAmJiAhc3N1c2It PmlzX2hvc3QpIHsKLQkJc3N1c2JfbW9kZV9tYW51YWxfc3dpdGNoKHNzdXNiLCAxKTsKKwkJc3N1 c2JfbW9kZV9zd2l0Y2goc3N1c2IsIDEpOwogCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnVmLCAiZGV2 aWNlIiwgNikgJiYgc3N1c2ItPmlzX2hvc3QpIHsKLQkJc3N1c2JfbW9kZV9tYW51YWxfc3dpdGNo KHNzdXNiLCAwKTsKKwkJc3N1c2JfbW9kZV9zd2l0Y2goc3N1c2IsIDApOwogCX0gZWxzZSB7CiAJ CWRldl9lcnIoc3N1c2ItPmRldiwgIndyb25nIG9yIGR1cGxpY2F0ZWQgc2V0dGluZ1xuIik7CiAJ CXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXR1My9tdHUzX2RyLmMg Yi9kcml2ZXJzL3VzYi9tdHUzL210dTNfZHIuYwppbmRleCA1ZmNiNzFhZjg3NWEuLjVmMjAxNDFk ZDU3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXR1My9tdHUzX2RyLmMKKysrIGIvZHJpdmVy cy91c2IvbXR1My9tdHUzX2RyLmMKQEAgLTcsNiArNyw4IEBACiAgKiBBdXRob3I6IENodW5mZW5n IFl1biA8Y2h1bmZlbmcueXVuQG1lZGlhdGVrLmNvbT4KICAqLwogCisjaW5jbHVkZSA8bGludXgv dXNiL3JvbGUuaD4KKwogI2luY2x1ZGUgIm10dTMuaCIKICNpbmNsdWRlICJtdHUzX2RyLmgiCiAj aW5jbHVkZSAibXR1M19kZWJ1Zy5oIgpAQCAtMjgwLDcgKzI4Miw3IEBAIHN0YXRpYyBpbnQgc3N1 c2JfZXh0Y29uX3JlZ2lzdGVyKHN0cnVjdCBvdGdfc3dpdGNoX210ayAqb3RnX3N4KQogICogVGhp cyBpcyB1c2VmdWwgaW4gc3BlY2lhbCBjYXNlcywgc3VjaCBhcyB1c2VzIFRZUEUtQSByZWNlcHRh Y2xlIGJ1dCBhbHNvCiAgKiB3YW50cyB0byBzdXBwb3J0IGR1YWwtcm9sZSBtb2RlLgogICovCi12 b2lkIHNzdXNiX21vZGVfbWFudWFsX3N3aXRjaChzdHJ1Y3Qgc3N1c2JfbXRrICpzc3VzYiwgaW50 IHRvX2hvc3QpCit2b2lkIHNzdXNiX21vZGVfc3dpdGNoKHN0cnVjdCBzc3VzYl9tdGsgKnNzdXNi LCBpbnQgdG9faG9zdCkKIHsKIAlzdHJ1Y3Qgb3RnX3N3aXRjaF9tdGsgKm90Z19zeCA9ICZzc3Vz Yi0+b3RnX3N3aXRjaDsKIApAQCAtMzE4LDYgKzMyMCw0NiBAQCB2b2lkIHNzdXNiX3NldF9mb3Jj ZV9tb2RlKHN0cnVjdCBzc3VzYl9tdGsgKnNzdXNiLAogCW10dTNfd3JpdGVsKHNzdXNiLT5pcHBj X2Jhc2UsIFNTVVNCX1UyX0NUUkwoMCksIHZhbHVlKTsKIH0KIAorc3RhdGljIGludCBzc3VzYl9y b2xlX3N3X3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gdXNiX3JvbGUgcm9sZSkKK3sKKwlz dHJ1Y3Qgc3N1c2JfbXRrICpzc3VzYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWJvb2wgdG9f aG9zdCA9IGZhbHNlOworCisJaWYgKHJvbGUgPT0gVVNCX1JPTEVfSE9TVCkKKwkJdG9faG9zdCA9 IHRydWU7CisKKwlpZiAodG9faG9zdCBeIHNzdXNiLT5pc19ob3N0KQorCQlzc3VzYl9tb2RlX3N3 aXRjaChzc3VzYiwgdG9faG9zdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gdXNi X3JvbGUgc3N1c2Jfcm9sZV9zd19nZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBz c3VzYl9tdGsgKnNzdXNiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJZW51bSB1c2Jfcm9sZSBy b2xlOworCisJcm9sZSA9IHNzdXNiLT5pc19ob3N0ID8gVVNCX1JPTEVfSE9TVCA6IFVTQl9ST0xF X0RFVklDRTsKKworCXJldHVybiByb2xlOworfQorCitzdGF0aWMgaW50IHNzdXNiX3JvbGVfc3df cmVnaXN0ZXIoc3RydWN0IG90Z19zd2l0Y2hfbXRrICpvdGdfc3gpCit7CisJc3RydWN0IHVzYl9y b2xlX3N3aXRjaF9kZXNjIHJvbGVfc3hfZGVzYyA9IHsgMCB9OworCXN0cnVjdCBzc3VzYl9tdGsg KnNzdXNiID0KKwkJY29udGFpbmVyX29mKG90Z19zeCwgc3RydWN0IHNzdXNiX210aywgb3RnX3N3 aXRjaCk7CisKKwlpZiAoIW90Z19zeC0+cm9sZV9zd191c2VkKQorCQlyZXR1cm4gMDsKKworCXJv bGVfc3hfZGVzYy5zZXQgPSBzc3VzYl9yb2xlX3N3X3NldDsKKwlyb2xlX3N4X2Rlc2MuZ2V0ID0g c3N1c2Jfcm9sZV9zd19nZXQ7CisJb3RnX3N4LT5yb2xlX3N3ID0gdXNiX3JvbGVfc3dpdGNoX3Jl Z2lzdGVyKHNzdXNiLT5kZXYsICZyb2xlX3N4X2Rlc2MpOworCisJcmV0dXJuIFBUUl9FUlJfT1Jf WkVSTyhvdGdfc3gtPnJvbGVfc3cpOworfQorCiBpbnQgc3N1c2Jfb3RnX3N3aXRjaF9pbml0KHN0 cnVjdCBzc3VzYl9tdGsgKnNzdXNiKQogewogCXN0cnVjdCBvdGdfc3dpdGNoX210ayAqb3RnX3N4 ID0gJnNzdXNiLT5vdGdfc3dpdGNoOwpAQCAtMzI4LDYgKzM3MCw4IEBAIGludCBzc3VzYl9vdGdf c3dpdGNoX2luaXQoc3RydWN0IHNzdXNiX210ayAqc3N1c2IpCiAKIAlpZiAob3RnX3N4LT5tYW51 YWxfZHJkX2VuYWJsZWQpCiAJCXNzdXNiX2RyX2RlYnVnZnNfaW5pdChzc3VzYik7CisJZWxzZSBp ZiAob3RnX3N4LT5yb2xlX3N3X3VzZWQpCisJCXJldCA9IHNzdXNiX3JvbGVfc3dfcmVnaXN0ZXIo b3RnX3N4KTsKIAllbHNlCiAJCXJldCA9IHNzdXNiX2V4dGNvbl9yZWdpc3RlcihvdGdfc3gpOwog CkBAIC0zNDAsNCArMzg0LDUgQEAgdm9pZCBzc3VzYl9vdGdfc3dpdGNoX2V4aXQoc3RydWN0IHNz dXNiX210ayAqc3N1c2IpCiAKIAljYW5jZWxfd29ya19zeW5jKCZvdGdfc3gtPmlkX3dvcmspOwog CWNhbmNlbF93b3JrX3N5bmMoJm90Z19zeC0+dmJ1c193b3JrKTsKKwl1c2Jfcm9sZV9zd2l0Y2hf dW5yZWdpc3RlcihvdGdfc3gtPnJvbGVfc3cpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv bXR1My9tdHUzX2RyLmggYi9kcml2ZXJzL3VzYi9tdHUzL210dTNfZHIuaAppbmRleCBiYTZmZTM1 N2NlMjkuLjVlNThjNGRiZDU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXR1My9tdHUzX2Ry LmgKKysrIGIvZHJpdmVycy91c2IvbXR1My9tdHUzX2RyLmgKQEAgLTcxLDcgKzcxLDcgQEAgc3Rh dGljIGlubGluZSB2b2lkIHNzdXNiX2dhZGdldF9leGl0KHN0cnVjdCBzc3VzYl9tdGsgKnNzdXNi KQogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9NVFUzX0RVQUxfUk9MRSkKIGludCBzc3VzYl9v dGdfc3dpdGNoX2luaXQoc3RydWN0IHNzdXNiX210ayAqc3N1c2IpOwogdm9pZCBzc3VzYl9vdGdf c3dpdGNoX2V4aXQoc3RydWN0IHNzdXNiX210ayAqc3N1c2IpOwotdm9pZCBzc3VzYl9tb2RlX21h bnVhbF9zd2l0Y2goc3RydWN0IHNzdXNiX210ayAqc3N1c2IsIGludCB0b19ob3N0KTsKK3ZvaWQg c3N1c2JfbW9kZV9zd2l0Y2goc3RydWN0IHNzdXNiX210ayAqc3N1c2IsIGludCB0b19ob3N0KTsK IGludCBzc3VzYl9zZXRfdmJ1cyhzdHJ1Y3Qgb3RnX3N3aXRjaF9tdGsgKm90Z19zeCwgaW50IGlz X29uKTsKIHZvaWQgc3N1c2Jfc2V0X2ZvcmNlX21vZGUoc3RydWN0IHNzdXNiX210ayAqc3N1c2Is CiAJCQkgIGVudW0gbXR1M19kcl9mb3JjZV9tb2RlIG1vZGUpOwpAQCAtODYsOCArODYsOCBAQCBz dGF0aWMgaW5saW5lIGludCBzc3VzYl9vdGdfc3dpdGNoX2luaXQoc3RydWN0IHNzdXNiX210ayAq c3N1c2IpCiBzdGF0aWMgaW5saW5lIHZvaWQgc3N1c2Jfb3RnX3N3aXRjaF9leGl0KHN0cnVjdCBz c3VzYl9tdGsgKnNzdXNiKQoge30KIAotc3RhdGljIGlubGluZSB2b2lkCi1zc3VzYl9tb2RlX21h bnVhbF9zd2l0Y2goc3RydWN0IHNzdXNiX210ayAqc3N1c2IsIGludCB0b19ob3N0KSB7fQorc3Rh dGljIGlubGluZSB2b2lkIHNzdXNiX21vZGVfc3dpdGNoKHN0cnVjdCBzc3VzYl9tdGsgKnNzdXNi LCBpbnQgdG9faG9zdCkKK3t9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNzdXNiX3NldF92YnVzKHN0 cnVjdCBvdGdfc3dpdGNoX210ayAqb3RnX3N4LCBpbnQgaXNfb24pCiB7CmRpZmYgLS1naXQgYS9k cml2ZXJzL3VzYi9tdHUzL210dTNfcGxhdC5jIGIvZHJpdmVycy91c2IvbXR1My9tdHUzX3BsYXQu YwppbmRleCBmZDBmNmM1ZGZiYzEuLjljMjU2ZWEzY2RmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91 c2IvbXR1My9tdHUzX3BsYXQuYworKysgYi9kcml2ZXJzL3VzYi9tdHUzL210dTNfcGxhdC5jCkBA IC0yOTksOCArMjk5LDkgQEAgc3RhdGljIGludCBnZXRfc3N1c2JfcnNjcyhzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgc3N1c2JfbXRrICpzc3VzYikKIAlvdGdfc3gtPmlzX3Uz X2RyZCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAibWVkaWF0ZWssdXNiMy1kcmQiKTsK IAlvdGdfc3gtPm1hbnVhbF9kcmRfZW5hYmxlZCA9CiAJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChu b2RlLCAiZW5hYmxlLW1hbnVhbC1kcmQiKTsKKwlvdGdfc3gtPnJvbGVfc3dfdXNlZCA9IG9mX3By b3BlcnR5X3JlYWRfYm9vbChub2RlLCAidXNiLXJvbGUtc3dpdGNoIik7CiAKLQlpZiAob2ZfcHJv cGVydHlfcmVhZF9ib29sKG5vZGUsICJleHRjb24iKSkgeworCWlmICghb3RnX3N4LT5yb2xlX3N3 X3VzZWQgJiYgb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJleHRjb24iKSkgewogCQlvdGdf c3gtPmVkZXYgPSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShzc3VzYi0+ZGV2LCAwKTsKIAkJ aWYgKElTX0VSUihvdGdfc3gtPmVkZXYpKSB7CiAJCQlkZXZfZXJyKHNzdXNiLT5kZXYsICJjb3Vs ZG4ndCBnZXQgZXh0Y29uIGRldmljZVxuIik7Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 535B9C4360F for ; Wed, 3 Apr 2019 02:11:19 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 10BCC206DD for ; Wed, 3 Apr 2019 02:11:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="DOHKBZTE" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 10BCC206DD Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=BZoso0k0t/uZDSC/cBieoCvx6VToKfxcchTD4BQanCI=; b=DOHKBZTEHwBtFJ tQiiffww7gP/puMeUYzNyihJG/CyvxY3qpqxj9EcjfdHikYHPlhGCZN4MI3HDtVVaGvJ+nWkGldkh PMZkSwcVKIpnzxCCRwCDnM/JCZ6kfgToEdnFRCxrkdzOSIJnehA6LxCQ8sNTyY/Lbjk91/+dnauoL A8L8ZHhU0xfikVQHDQTTh2IeLcDscclQQDAOgubbyX43sMd9N9lTW8t6hmSxDnNOZe9uLuwsEF8ny iIf224rkQorRGXAhM2oUTGU/gxgmB5t3uyAkZwKvqYZNmq/xeAM2NzfYxoDrhWe4YD3+zqshJm6Eg orbMWk3xCMvoH28UIKUA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hBVMw-0004zK-4t; Wed, 03 Apr 2019 02:11:14 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hBVMs-0004ya-Lo; Wed, 03 Apr 2019 02:11:12 +0000 X-UUID: 2d19fd1ada5e423f826457b193597449-20190402 X-UUID: 2d19fd1ada5e423f826457b193597449-20190402 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 1205904508; Tue, 02 Apr 2019 18:09:57 -0800 Received: from MTKMBS31N2.mediatek.inc (172.27.4.87) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 2 Apr 2019 19:09:56 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Wed, 3 Apr 2019 10:09:53 +0800 Received: from localhost.localdomain (10.17.3.153) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Wed, 3 Apr 2019 10:09:48 +0800 From: Chunfeng Yun To: Rob Herring , Greg Kroah-Hartman , Heikki Krogerus Subject: [v3 PATCH 6/6] usb: mtu3: register a USB Role Switch for dual role mode Date: Wed, 3 Apr 2019 10:09:14 +0800 Message-ID: <1554257354-7440-7-git-send-email-chunfeng.yun@mediatek.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1554257354-7440-1-git-send-email-chunfeng.yun@mediatek.com> References: <1554257354-7440-1-git-send-email-chunfeng.yun@mediatek.com> MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190402_191110_717071_15CAF852 X-CRM114-Status: GOOD ( 16.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, Hans de Goede , Badhri Jagan Sridharan , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Matthias Brugger , Andy Shevchenko , Alan Stern , Min Guo , Chunfeng Yun , linux-mediatek@lists.infradead.org, Adam Thomson , linux-arm-kernel@lists.infradead.org, Li Jun Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org Because 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 --- v3 changes: 1. select USB_ROLE_SWITCH in Kconfig suggested by Heikki 2. rename ssusb_mode_manual_switch() to ssusb_mode_switch() v2 no change --- drivers/usb/mtu3/Kconfig | 1 + drivers/usb/mtu3/mtu3.h | 5 ++++ drivers/usb/mtu3/mtu3_debugfs.c | 4 +-- drivers/usb/mtu3/mtu3_dr.c | 47 ++++++++++++++++++++++++++++++++- drivers/usb/mtu3/mtu3_dr.h | 6 ++--- drivers/usb/mtu3/mtu3_plat.c | 3 ++- 6 files changed, 59 insertions(+), 7 deletions(-) diff --git a/drivers/usb/mtu3/Kconfig b/drivers/usb/mtu3/Kconfig index bcc23486c4ed..88e3db7b3016 100644 --- a/drivers/usb/mtu3/Kconfig +++ b/drivers/usb/mtu3/Kconfig @@ -43,6 +43,7 @@ config USB_MTU3_DUAL_ROLE bool "Dual Role mode" depends on ((USB=y || USB=USB_MTU3) && (USB_GADGET=y || USB_GADGET=USB_MTU3)) depends on (EXTCON=y || EXTCON=USB_MTU3) + select USB_ROLE_SWITCH help This is the default mode of working of MTU3 controller where both host and gadget features are enabled. diff --git a/drivers/usb/mtu3/mtu3.h b/drivers/usb/mtu3/mtu3.h index 76ecf12fdf62..6087be236a35 100644 --- a/drivers/usb/mtu3/mtu3.h +++ b/drivers/usb/mtu3/mtu3.h @@ -199,6 +199,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. @@ -212,6 +215,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_debugfs.c b/drivers/usb/mtu3/mtu3_debugfs.c index 62c57ddc554e..c96e5dab0a48 100644 --- a/drivers/usb/mtu3/mtu3_debugfs.c +++ b/drivers/usb/mtu3/mtu3_debugfs.c @@ -453,9 +453,9 @@ static ssize_t ssusb_mode_write(struct file *file, const char __user *ubuf, 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; diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c index 5fcb71af875a..5f20141dd57f 100644 --- a/drivers/usb/mtu3/mtu3_dr.c +++ b/drivers/usb/mtu3/mtu3_dr.c @@ -7,6 +7,8 @@ * Author: Chunfeng Yun */ +#include + #include "mtu3.h" #include "mtu3_dr.h" #include "mtu3_debug.h" @@ -280,7 +282,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. */ -void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) +void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) { struct otg_switch_mtk *otg_sx = &ssusb->otg_switch; @@ -318,6 +320,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; @@ -328,6 +370,8 @@ int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) if (otg_sx->manual_drd_enabled) ssusb_dr_debugfs_init(ssusb); + else if (otg_sx->role_sw_used) + ret = ssusb_role_sw_register(otg_sx); else ret = ssusb_extcon_register(otg_sx); @@ -340,4 +384,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_dr.h b/drivers/usb/mtu3/mtu3_dr.h index ba6fe357ce29..5e58c4dbd54a 100644 --- a/drivers/usb/mtu3/mtu3_dr.h +++ b/drivers/usb/mtu3/mtu3_dr.h @@ -71,7 +71,7 @@ static inline void ssusb_gadget_exit(struct ssusb_mtk *ssusb) #if IS_ENABLED(CONFIG_USB_MTU3_DUAL_ROLE) int ssusb_otg_switch_init(struct ssusb_mtk *ssusb); void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb); -void ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host); +void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host); int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on); void ssusb_set_force_mode(struct ssusb_mtk *ssusb, enum mtu3_dr_force_mode mode); @@ -86,8 +86,8 @@ static inline int ssusb_otg_switch_init(struct ssusb_mtk *ssusb) static inline void ssusb_otg_switch_exit(struct ssusb_mtk *ssusb) {} -static inline void -ssusb_mode_manual_switch(struct ssusb_mtk *ssusb, int to_host) {} +static inline void ssusb_mode_switch(struct ssusb_mtk *ssusb, int to_host) +{} static inline int ssusb_set_vbus(struct otg_switch_mtk *otg_sx, int is_on) { diff --git a/drivers/usb/mtu3/mtu3_plat.c b/drivers/usb/mtu3/mtu3_plat.c index fd0f6c5dfbc1..9c256ea3cdf5 100644 --- a/drivers/usb/mtu3/mtu3_plat.c +++ b/drivers/usb/mtu3/mtu3_plat.c @@ -299,8 +299,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 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel