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,URIBL_BLOCKED, 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 58E63C64EB4 for ; Mon, 3 Dec 2018 03:46:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2AACD20848 for ; Mon, 3 Dec 2018 03:46:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2AACD20848 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726043AbeLCDpt (ORCPT ); Sun, 2 Dec 2018 22:45:49 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:15191 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725955AbeLCDps (ORCPT ); Sun, 2 Dec 2018 22:45:48 -0500 Received: from DGGEMS412-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 4F2113E3EFCED; Mon, 3 Dec 2018 11:45:42 +0800 (CST) Received: from vm100-107-113-134.huawei.com (100.107.113.134) by DGGEMS412-HUB.china.huawei.com (10.3.19.212) with Microsoft SMTP Server id 14.3.408.0; Mon, 3 Dec 2018 11:45:34 +0800 From: Yu Chen To: , , CC: , , Yu Chen , Felipe Balbi , Greg Kroah-Hartman , Heikki Krogerus Subject: [PATCH v1 09/12] usb: dwc3: Registering a role switch in the DRD code. Date: Mon, 3 Dec 2018 11:45:12 +0800 Message-ID: <20181203034515.91412-10-chenyu56@huawei.com> X-Mailer: git-send-email 2.15.0-rc2 In-Reply-To: <20181203034515.91412-1-chenyu56@huawei.com> References: <20181203034515.91412-1-chenyu56@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [100.107.113.134] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The Type-C drivers use USB role switch API to inform the system about the negotiated data role, so registering a role switch in the DRD code in order to support platforms with USB Type-C connectors. Cc: Felipe Balbi Cc: Greg Kroah-Hartman Signed-off-by: Yu Chen Signed-off-by: Heikki Krogerus -- v0: The patch is provided by Heikki Krogerus. I modified and test it on Hikey960 platform. -- --- drivers/usb/dwc3/core.h | 2 ++ drivers/usb/dwc3/drd.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index b3cea95f7720..47e388878e9a 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -1057,6 +1058,7 @@ struct dwc3 { struct extcon_dev *edev; struct notifier_block edev_nb; enum usb_phy_interface hsphy_mode; + struct usb_role_switch *role_sw; u32 fladj; u32 irq_gadget; diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c index 218371f985ca..3155121e6d29 100644 --- a/drivers/usb/dwc3/drd.c +++ b/drivers/usb/dwc3/drd.c @@ -463,6 +463,48 @@ static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc) return edev; } +static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role) +{ + u32 mode; + + pr_info("%s:set role %d\n", __func__, role); + + switch (role) { + case USB_ROLE_HOST: + mode = DWC3_GCTL_PRTCAP_HOST; + break; + case USB_ROLE_DEVICE: + mode = DWC3_GCTL_PRTCAP_DEVICE; + break; + default: + mode = DWC3_GCTL_PRTCAP_HOST; + break; + }; + + dwc3_set_mode(dev_get_drvdata(dev), mode); + return 0; + +} + +static enum usb_role dwc3_usb_role_switch_get(struct device *dev) +{ + struct dwc3 *dwc = dev_get_drvdata(dev); + unsigned long flags; + enum usb_role role; + + spin_lock_irqsave(&dwc->lock, flags); + role = dwc->current_otg_role; + spin_unlock_irqrestore(&dwc->lock, flags); + + return role; + +} + +static const struct usb_role_switch_desc dwc3_role_switch = { + .set = dwc3_usb_role_switch_set, + .get = dwc3_usb_role_switch_get, +}; + int dwc3_drd_init(struct dwc3 *dwc) { int ret, irq; @@ -511,6 +553,11 @@ int dwc3_drd_init(struct dwc3 *dwc) dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG); } + dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch); + if (ret) { + dwc3_drd_exit(dwc); + return PTR_ERR(dwc->role_sw); + } return 0; } @@ -546,4 +593,6 @@ void dwc3_drd_exit(struct dwc3 *dwc) if (!dwc->edev) free_irq(dwc->otg_irq, dwc); + + usb_role_switch_unregister(dwc->role_sw); } -- 2.15.0-rc2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yu Chen Subject: [PATCH v1 09/12] usb: dwc3: Registering a role switch in the DRD code. Date: Mon, 3 Dec 2018 11:45:12 +0800 Message-ID: <20181203034515.91412-10-chenyu56@huawei.com> References: <20181203034515.91412-1-chenyu56@huawei.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <20181203034515.91412-1-chenyu56@huawei.com> Sender: linux-kernel-owner@vger.kernel.org To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Yu Chen , Felipe Balbi , Greg Kroah-Hartman , Heikki Krogerus List-Id: devicetree@vger.kernel.org The Type-C drivers use USB role switch API to inform the system about the negotiated data role, so registering a role switch in the DRD code in order to support platforms with USB Type-C connectors. Cc: Felipe Balbi Cc: Greg Kroah-Hartman Signed-off-by: Yu Chen Signed-off-by: Heikki Krogerus -- v0: The patch is provided by Heikki Krogerus. I modified and test it on Hikey960 platform. -- --- drivers/usb/dwc3/core.h | 2 ++ drivers/usb/dwc3/drd.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index b3cea95f7720..47e388878e9a 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -1057,6 +1058,7 @@ struct dwc3 { struct extcon_dev *edev; struct notifier_block edev_nb; enum usb_phy_interface hsphy_mode; + struct usb_role_switch *role_sw; u32 fladj; u32 irq_gadget; diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c index 218371f985ca..3155121e6d29 100644 --- a/drivers/usb/dwc3/drd.c +++ b/drivers/usb/dwc3/drd.c @@ -463,6 +463,48 @@ static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc) return edev; } +static int dwc3_usb_role_switch_set(struct device *dev, enum usb_role role) +{ + u32 mode; + + pr_info("%s:set role %d\n", __func__, role); + + switch (role) { + case USB_ROLE_HOST: + mode = DWC3_GCTL_PRTCAP_HOST; + break; + case USB_ROLE_DEVICE: + mode = DWC3_GCTL_PRTCAP_DEVICE; + break; + default: + mode = DWC3_GCTL_PRTCAP_HOST; + break; + }; + + dwc3_set_mode(dev_get_drvdata(dev), mode); + return 0; + +} + +static enum usb_role dwc3_usb_role_switch_get(struct device *dev) +{ + struct dwc3 *dwc = dev_get_drvdata(dev); + unsigned long flags; + enum usb_role role; + + spin_lock_irqsave(&dwc->lock, flags); + role = dwc->current_otg_role; + spin_unlock_irqrestore(&dwc->lock, flags); + + return role; + +} + +static const struct usb_role_switch_desc dwc3_role_switch = { + .set = dwc3_usb_role_switch_set, + .get = dwc3_usb_role_switch_get, +}; + int dwc3_drd_init(struct dwc3 *dwc) { int ret, irq; @@ -511,6 +553,11 @@ int dwc3_drd_init(struct dwc3 *dwc) dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG); } + dwc->role_sw = usb_role_switch_register(dwc->dev, &dwc3_role_switch); + if (ret) { + dwc3_drd_exit(dwc); + return PTR_ERR(dwc->role_sw); + } return 0; } @@ -546,4 +593,6 @@ void dwc3_drd_exit(struct dwc3 *dwc) if (!dwc->edev) free_irq(dwc->otg_irq, dwc); + + usb_role_switch_unregister(dwc->role_sw); } -- 2.15.0-rc2 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: [v1,09/12] usb: dwc3: Registering a role switch in the DRD code. From: Yu Chen Message-Id: <20181203034515.91412-10-chenyu56@huawei.com> Date: Mon, 3 Dec 2018 11:45:12 +0800 To: linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: suzhuangluan@hisilicon.com, kongfei@hisilicon.com, Yu Chen , Felipe Balbi , Greg Kroah-Hartman , Heikki Krogerus List-ID: VGhlIFR5cGUtQyBkcml2ZXJzIHVzZSBVU0Igcm9sZSBzd2l0Y2ggQVBJIHRvIGluZm9ybSB0aGUK c3lzdGVtIGFib3V0IHRoZSBuZWdvdGlhdGVkIGRhdGEgcm9sZSwgc28gcmVnaXN0ZXJpbmcgYSBy b2xlCnN3aXRjaCBpbiB0aGUgRFJEIGNvZGUgaW4gb3JkZXIgdG8gc3VwcG9ydCBwbGF0Zm9ybXMg d2l0aApVU0IgVHlwZS1DIGNvbm5lY3RvcnMuCgpDYzogRmVsaXBlIEJhbGJpIDxiYWxiaUBrZXJu ZWwub3JnPgpDYzogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9y Zz4KU2lnbmVkLW9mZi1ieTogWXUgQ2hlbiA8Y2hlbnl1NTZAaHVhd2VpLmNvbT4KU2lnbmVkLW9m Zi1ieTogSGVpa2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNAbGludXguaW50ZWwuY29tPgot LS0KdjA6ClRoZSBwYXRjaCBpcyBwcm92aWRlZCBieSBIZWlra2kgS3JvZ2VydXMuIEkgbW9kaWZp ZWQgYW5kIHRlc3QgaXQKb24gSGlrZXk5NjAgcGxhdGZvcm0uCi0tCi0tLQogZHJpdmVycy91c2Iv ZHdjMy9jb3JlLmggfCAgMiArKwogZHJpdmVycy91c2IvZHdjMy9kcmQuYyAgfCA0OSArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5n ZWQsIDUxIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUu aCBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCmluZGV4IGIzY2VhOTVmNzcyMC4uNDdlMzg4ODc4 ZTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaAorKysgYi9kcml2ZXJzL3Vz Yi9kd2MzL2NvcmUuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDku aD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL290 Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9yb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvdWxwaS9p bnRlcmZhY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KQEAgLTEwNTcsNiArMTA1 OCw3IEBAIHN0cnVjdCBkd2MzIHsKIAlzdHJ1Y3QgZXh0Y29uX2RldgkqZWRldjsKIAlzdHJ1Y3Qg bm90aWZpZXJfYmxvY2sJZWRldl9uYjsKIAllbnVtIHVzYl9waHlfaW50ZXJmYWNlCWhzcGh5X21v ZGU7CisJc3RydWN0IHVzYl9yb2xlX3N3aXRjaAkqcm9sZV9zdzsKIAogCXUzMgkJCWZsYWRqOwog CXUzMgkJCWlycV9nYWRnZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2RyZC5jIGIv ZHJpdmVycy91c2IvZHdjMy9kcmQuYwppbmRleCAyMTgzNzFmOTg1Y2EuLjMxNTUxMjFlNmQyOSAx MDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9kcmQuYworKysgYi9kcml2ZXJzL3VzYi9kd2Mz L2RyZC5jCkBAIC00NjMsNiArNDYzLDQ4IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0Y29uX2RldiAqZHdj M19nZXRfZXh0Y29uKHN0cnVjdCBkd2MzICpkd2MpCiAJcmV0dXJuIGVkZXY7CiB9CiAKK3N0YXRp YyBpbnQgZHdjM191c2Jfcm9sZV9zd2l0Y2hfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSB1 c2Jfcm9sZSByb2xlKQoreworCXUzMiBtb2RlOworCisJcHJfaW5mbygiJXM6c2V0IHJvbGUgJWRc biIsIF9fZnVuY19fLCByb2xlKTsKKworCXN3aXRjaCAocm9sZSkgeworCWNhc2UgVVNCX1JPTEVf SE9TVDoKKwkJbW9kZSA9IERXQzNfR0NUTF9QUlRDQVBfSE9TVDsKKwkJYnJlYWs7CisJY2FzZSBV U0JfUk9MRV9ERVZJQ0U6CisJCW1vZGUgPSBEV0MzX0dDVExfUFJUQ0FQX0RFVklDRTsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJbW9kZSA9IERXQzNfR0NUTF9QUlRDQVBfSE9TVDsKKwkJYnJlYWs7 CisJfTsKKworCWR3YzNfc2V0X21vZGUoZGV2X2dldF9kcnZkYXRhKGRldiksIG1vZGUpOworCXJl dHVybiAwOworCit9CisKK3N0YXRpYyBlbnVtIHVzYl9yb2xlIGR3YzNfdXNiX3JvbGVfc3dpdGNo X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGR3YzMgKmR3YyA9IGRldl9nZXRf ZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW51bSB1c2Jfcm9sZSByb2xl OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOworCXJvbGUgPSBkd2Mt PmN1cnJlbnRfb3RnX3JvbGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdjLT5sb2NrLCBm bGFncyk7CisKKwlyZXR1cm4gcm9sZTsKKworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9y b2xlX3N3aXRjaF9kZXNjIGR3YzNfcm9sZV9zd2l0Y2ggPSB7CisJLnNldCA9IGR3YzNfdXNiX3Jv bGVfc3dpdGNoX3NldCwKKwkuZ2V0ID0gZHdjM191c2Jfcm9sZV9zd2l0Y2hfZ2V0LAorfTsKKwog aW50IGR3YzNfZHJkX2luaXQoc3RydWN0IGR3YzMgKmR3YykKIHsKIAlpbnQgcmV0LCBpcnE7CkBA IC01MTEsNiArNTUzLDExIEBAIGludCBkd2MzX2RyZF9pbml0KHN0cnVjdCBkd2MzICpkd2MpCiAJ CWR3YzNfc2V0X21vZGUoZHdjLCBEV0MzX0dDVExfUFJUQ0FQX09URyk7CiAJfQogCisJZHdjLT5y b2xlX3N3ID0gdXNiX3JvbGVfc3dpdGNoX3JlZ2lzdGVyKGR3Yy0+ZGV2LCAmZHdjM19yb2xlX3N3 aXRjaCk7CisJaWYgKHJldCkgeworCQlkd2MzX2RyZF9leGl0KGR3Yyk7CisJCXJldHVybiBQVFJf RVJSKGR3Yy0+cm9sZV9zdyk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC01NDYsNCArNTkzLDYg QEAgdm9pZCBkd2MzX2RyZF9leGl0KHN0cnVjdCBkd2MzICpkd2MpCiAKIAlpZiAoIWR3Yy0+ZWRl dikKIAkJZnJlZV9pcnEoZHdjLT5vdGdfaXJxLCBkd2MpOworCisJdXNiX3JvbGVfc3dpdGNoX3Vu cmVnaXN0ZXIoZHdjLT5yb2xlX3N3KTsKIH0K