From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-os2jpn01on0090.outbound.protection.outlook.com ([104.47.92.90]:2177 "EHLO JPN01-OS2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727656AbeKIV1R (ORCPT ); Fri, 9 Nov 2018 16:27:17 -0500 From: Yoshihiro Shimoda To: balbi@kernel.org Cc: gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Yoshihiro Shimoda Subject: [PATCH] usb: gadget: udc: renesas_usb3: add a safety connection way for forced_b_device Date: Fri, 9 Nov 2018 20:44:36 +0900 Message-Id: <1541763876-19622-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: This patch adds a safety connection way for "forced_b_device" with "workaround_for_vbus" like below: < Example for R-Car E3 Ebisu > # modprobe # echo 1 > /sys/kernel/debug/ee020000.usb/b_device (connect a usb cable to host side.) # echo 2 > /sys/kernel/debug/ee020000.usb/b_device Previous code should have connected a usb cable before the "b_device" is set to 1 on the Ebisu board. However, if xHCI driver on the board is probed, it causes some troubles: - Conflicts USB VBUS/signals between the board and another host. - "Cannot enable. Maybe the USB cable is bad?" might happen on both the board and another host with a usb hub. - Cannot enumerate a usb gadget correctly because an interruption of VBUS change happens unexpectedly. Reported-by: Kazuya Mizuguchi Signed-off-by: Yoshihiro Shimoda --- drivers/usb/gadget/udc/renesas_usb3.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index cdffbd1..6e34f95 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c @@ -358,6 +358,7 @@ struct renesas_usb3 { bool extcon_host; /* check id and set EXTCON_USB_HOST */ bool extcon_usb; /* check vbus and set EXTCON_USB */ bool forced_b_device; + bool start_to_connect; }; #define gadget_to_renesas_usb3(_gadget) \ @@ -476,7 +477,8 @@ static void usb3_init_axi_bridge(struct renesas_usb3 *usb3) static void usb3_init_epc_registers(struct renesas_usb3 *usb3) { usb3_write(usb3, ~0, USB3_USB_INT_STA_1); - usb3_enable_irq_1(usb3, USB_INT_1_VBUS_CNG); + if (!usb3->workaround_for_vbus) + usb3_enable_irq_1(usb3, USB_INT_1_VBUS_CNG); } static bool usb3_wakeup_usb2_phy(struct renesas_usb3 *usb3) @@ -700,8 +702,7 @@ static void usb3_mode_config(struct renesas_usb3 *usb3, bool host, bool a_dev) usb3_set_mode_by_role_sw(usb3, host); usb3_vbus_out(usb3, a_dev); /* for A-Peripheral or forced B-device mode */ - if ((!host && a_dev) || - (usb3->workaround_for_vbus && usb3->forced_b_device)) + if ((!host && a_dev) || usb3->start_to_connect) usb3_connect(usb3); spin_unlock_irqrestore(&usb3->lock, flags); } @@ -2432,7 +2433,11 @@ static ssize_t renesas_usb3_b_device_write(struct file *file, if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; - if (!strncmp(buf, "1", 1)) + usb3->start_to_connect = false; + if (usb3->workaround_for_vbus && usb3->forced_b_device && + !strncmp(buf, "2", 1)) + usb3->start_to_connect = true; + else if (!strncmp(buf, "1", 1)) usb3->forced_b_device = true; else usb3->forced_b_device = false; @@ -2440,7 +2445,7 @@ static ssize_t renesas_usb3_b_device_write(struct file *file, if (usb3->workaround_for_vbus) usb3_disconnect(usb3); - /* Let this driver call usb3_connect() anyway */ + /* Let this driver call usb3_connect() if needed */ usb3_check_id(usb3); return count; -- 1.9.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: usb: gadget: udc: renesas_usb3: add a safety connection way for forced_b_device From: Yoshihiro Shimoda Message-Id: <1541763876-19622-1-git-send-email-yoshihiro.shimoda.uh@renesas.com> Date: Fri, 9 Nov 2018 20:44:36 +0900 To: balbi@kernel.org Cc: gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Yoshihiro Shimoda List-ID: VGhpcyBwYXRjaCBhZGRzIGEgc2FmZXR5IGNvbm5lY3Rpb24gd2F5IGZvciAiZm9yY2VkX2JfZGV2 aWNlIiB3aXRoCiJ3b3JrYXJvdW5kX2Zvcl92YnVzIiBsaWtlIGJlbG93OgoKPCBFeGFtcGxlIGZv ciBSLUNhciBFMyBFYmlzdSA+CiAjIG1vZHByb2JlIDxhbnkgdXNiIGdhZGdldCBkcml2ZXI+CiAj IGVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL2VlMDIwMDAwLnVzYi9iX2RldmljZQogKGNvbm5l Y3QgYSB1c2IgY2FibGUgdG8gaG9zdCBzaWRlLikKICMgZWNobyAyID4gL3N5cy9rZXJuZWwvZGVi dWcvZWUwMjAwMDAudXNiL2JfZGV2aWNlCgpQcmV2aW91cyBjb2RlIHNob3VsZCBoYXZlIGNvbm5l Y3RlZCBhIHVzYiBjYWJsZSBiZWZvcmUgdGhlICJiX2RldmljZSIKaXMgc2V0IHRvIDEgb24gdGhl IEViaXN1IGJvYXJkLiBIb3dldmVyLCBpZiB4SENJIGRyaXZlciBvbiB0aGUgYm9hcmQKaXMgcHJv YmVkLCBpdCBjYXVzZXMgc29tZSB0cm91YmxlczoKIC0gQ29uZmxpY3RzIFVTQiBWQlVTL3NpZ25h bHMgYmV0d2VlbiB0aGUgYm9hcmQgYW5kIGFub3RoZXIgaG9zdC4KIC0gIkNhbm5vdCBlbmFibGUu IE1heWJlIHRoZSBVU0IgY2FibGUgaXMgYmFkPyIgbWlnaHQgaGFwcGVuIG9uCiAgIGJvdGggdGhl IGJvYXJkIGFuZCBhbm90aGVyIGhvc3Qgd2l0aCBhIHVzYiBodWIuCiAtIENhbm5vdCBlbnVtZXJh dGUgYSB1c2IgZ2FkZ2V0IGNvcnJlY3RseSBiZWNhdXNlIGFuIGludGVycnVwdGlvbgogICBvZiBW QlVTIGNoYW5nZSBoYXBwZW5zIHVuZXhwZWN0ZWRseS4KClJlcG9ydGVkLWJ5OiBLYXp1eWEgTWl6 dWd1Y2hpIDxrYXp1eWEubWl6dWd1Y2hpLmtzQHJlbmVzYXMuY29tPgpTaWduZWQtb2ZmLWJ5OiBZ b3NoaWhpcm8gU2hpbW9kYSA8eW9zaGloaXJvLnNoaW1vZGEudWhAcmVuZXNhcy5jb20+Ci0tLQog ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYyB8IDE1ICsrKysrKysrKystLS0t LQogMSBmaWxlIGNoYW5nZWQsIDEwIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYyBiL2RyaXZlcnMv dXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMKaW5kZXggY2RmZmJkMS4uNmUzNGY5NSAxMDA2 NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYworKysgYi9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL3JlbmVzYXNfdXNiMy5jCkBAIC0zNTgsNiArMzU4LDcgQEAgc3Ry dWN0IHJlbmVzYXNfdXNiMyB7CiAJYm9vbCBleHRjb25faG9zdDsJCS8qIGNoZWNrIGlkIGFuZCBz ZXQgRVhUQ09OX1VTQl9IT1NUICovCiAJYm9vbCBleHRjb25fdXNiOwkJLyogY2hlY2sgdmJ1cyBh bmQgc2V0IEVYVENPTl9VU0IgKi8KIAlib29sIGZvcmNlZF9iX2RldmljZTsKKwlib29sIHN0YXJ0 X3RvX2Nvbm5lY3Q7CiB9OwogCiAjZGVmaW5lIGdhZGdldF90b19yZW5lc2FzX3VzYjMoX2dhZGdl dCkJXApAQCAtNDc2LDcgKzQ3Nyw4IEBAIHN0YXRpYyB2b2lkIHVzYjNfaW5pdF9heGlfYnJpZGdl KHN0cnVjdCByZW5lc2FzX3VzYjMgKnVzYjMpCiBzdGF0aWMgdm9pZCB1c2IzX2luaXRfZXBjX3Jl Z2lzdGVycyhzdHJ1Y3QgcmVuZXNhc191c2IzICp1c2IzKQogewogCXVzYjNfd3JpdGUodXNiMywg fjAsIFVTQjNfVVNCX0lOVF9TVEFfMSk7Ci0JdXNiM19lbmFibGVfaXJxXzEodXNiMywgVVNCX0lO VF8xX1ZCVVNfQ05HKTsKKwlpZiAoIXVzYjMtPndvcmthcm91bmRfZm9yX3ZidXMpCisJCXVzYjNf ZW5hYmxlX2lycV8xKHVzYjMsIFVTQl9JTlRfMV9WQlVTX0NORyk7CiB9CiAKIHN0YXRpYyBib29s IHVzYjNfd2FrZXVwX3VzYjJfcGh5KHN0cnVjdCByZW5lc2FzX3VzYjMgKnVzYjMpCkBAIC03MDAs OCArNzAyLDcgQEAgc3RhdGljIHZvaWQgdXNiM19tb2RlX2NvbmZpZyhzdHJ1Y3QgcmVuZXNhc191 c2IzICp1c2IzLCBib29sIGhvc3QsIGJvb2wgYV9kZXYpCiAJdXNiM19zZXRfbW9kZV9ieV9yb2xl X3N3KHVzYjMsIGhvc3QpOwogCXVzYjNfdmJ1c19vdXQodXNiMywgYV9kZXYpOwogCS8qIGZvciBB LVBlcmlwaGVyYWwgb3IgZm9yY2VkIEItZGV2aWNlIG1vZGUgKi8KLQlpZiAoKCFob3N0ICYmIGFf ZGV2KSB8fAotCSAgICAodXNiMy0+d29ya2Fyb3VuZF9mb3JfdmJ1cyAmJiB1c2IzLT5mb3JjZWRf Yl9kZXZpY2UpKQorCWlmICgoIWhvc3QgJiYgYV9kZXYpIHx8IHVzYjMtPnN0YXJ0X3RvX2Nvbm5l Y3QpCiAJCXVzYjNfY29ubmVjdCh1c2IzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2Iz LT5sb2NrLCBmbGFncyk7CiB9CkBAIC0yNDMyLDcgKzI0MzMsMTEgQEAgc3RhdGljIHNzaXplX3Qg cmVuZXNhc191c2IzX2JfZGV2aWNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAogCWlmIChjb3B5 X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBtaW5fdChzaXplX3QsIHNpemVvZihidWYpIC0gMSwgY291 bnQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoIXN0cm5jbXAoYnVmLCAiMSIsIDEpKQor CXVzYjMtPnN0YXJ0X3RvX2Nvbm5lY3QgPSBmYWxzZTsKKwlpZiAodXNiMy0+d29ya2Fyb3VuZF9m b3JfdmJ1cyAmJiB1c2IzLT5mb3JjZWRfYl9kZXZpY2UgJiYKKwkgICAgIXN0cm5jbXAoYnVmLCAi MiIsIDEpKQorCQl1c2IzLT5zdGFydF90b19jb25uZWN0ID0gdHJ1ZTsKKwllbHNlIGlmICghc3Ry bmNtcChidWYsICIxIiwgMSkpCiAJCXVzYjMtPmZvcmNlZF9iX2RldmljZSA9IHRydWU7CiAJZWxz ZQogCQl1c2IzLT5mb3JjZWRfYl9kZXZpY2UgPSBmYWxzZTsKQEAgLTI0NDAsNyArMjQ0NSw3IEBA IHN0YXRpYyBzc2l6ZV90IHJlbmVzYXNfdXNiM19iX2RldmljZV93cml0ZShzdHJ1Y3QgZmlsZSAq ZmlsZSwKIAlpZiAodXNiMy0+d29ya2Fyb3VuZF9mb3JfdmJ1cykKIAkJdXNiM19kaXNjb25uZWN0 KHVzYjMpOwogCi0JLyogTGV0IHRoaXMgZHJpdmVyIGNhbGwgdXNiM19jb25uZWN0KCkgYW55d2F5 ICovCisJLyogTGV0IHRoaXMgZHJpdmVyIGNhbGwgdXNiM19jb25uZWN0KCkgaWYgbmVlZGVkICov CiAJdXNiM19jaGVja19pZCh1c2IzKTsKIAogCXJldHVybiBjb3VudDsK