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: dwc2: Fix endless deferral probe From: Stefan Wahren Message-Id: <1515526134-2148-1-git-send-email-stefan.wahren@i2se.com> Date: Tue, 9 Jan 2018 20:28:54 +0100 To: Arnd Bergmann , Eric Anholt , John Youn , Kishon Vijay Abraham I , Greg Kroah-Hartman Cc: Florian Fainelli , Felipe Balbi , Minas Harutyunyan , linux-arm-kernel@lists.infradead.org, linux-usb@vger.kernel.org, Stefan Wahren List-ID: VGhlIGR3YzIgVVNCIGRyaXZlciB0cmllcyB0byBmaW5kIGEgZ2VuZXJpYyBQSFkgZmlyc3QgYW5k IHRoZW4gbG9vawpmb3IgYW4gb2xkIHN0eWxlIFVTQiBQSFkuIEluIGNhc2Ugb2YgYSB2YWxpZCBn ZW5lcmljIFBIWSBub2RlIHdpdGhvdXQKYSBQSFkgZHJpdmVyLCB0aGUgUEhZIGxheWVyIHdpbGwg cmV0dXJuIC1FUFJPQkVfREVGRVIgZm9yZXZlci4gU28gZHdjMgp3aWxsIG5ldmVyIHRyaWVzIGZv ciBhbiBVU0IgUEhZLgoKRml4IHRoaXMgaXNzdWUgYnkgZmluZGluZyBhIGdlbmVyaWMgUEhZIGFu ZCBhbiBvbGQgc3R5bGUgVVNCIFBIWQphdCBvbmNlLgoKRml4ZXM6IDZjMmRhZDY5MTYzZiAoInVz YjogZHdjMjogUmV0dXJuIGVycm9ycyBmcm9tIFBIWSIpCkxpbms6IGh0dHBzOi8vbWFyYy5pbmZv Lz9sPWxpbnV4LXVzYiZtPTE1MTUxODMxNDMxNDc1MyZ3PTIKU2lnbmVkLW9mZi1ieTogU3RlZmFu IFdhaHJlbiA8c3RlZmFuLndhaHJlbkBpMnNlLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi9kd2MyL3Bs YXRmb3JtLmMgfCA0MiArKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0K IDEgZmlsZSBjaGFuZ2VkLCAyNCBpbnNlcnRpb25zKCspLCAxOCBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL3BsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9kd2MyL3Bs YXRmb3JtLmMKaW5kZXggM2UyNjU1MC4uNTI3OTU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Iv ZHdjMi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvcGxhdGZvcm0uYwpAQCAtMjI1 LDEwICsyMjUsMTEgQEAgc3RhdGljIGludCBkd2MyX2xvd2xldmVsX2h3X2luaXQoc3RydWN0IGR3 YzJfaHNvdGcgKmhzb3RnKQogCWhzb3RnLT5waHlpZiA9IEdVU0JDRkdfUEhZSUYxNjsKIAogCS8q Ci0JICogQXR0ZW1wdCB0byBmaW5kIGEgZ2VuZXJpYyBQSFksIHRoZW4gbG9vayBmb3IgYW4gb2xk IHN0eWxlCi0JICogVVNCIFBIWSBhbmQgdGhlbiBmYWxsIGJhY2sgdG8gcGRhdGEKKwkgKiBBdHRl bXB0IHRvIGZpbmQgYSBnZW5lcmljIFBIWSBvciBhbiBvbGQgc3R5bGUgVVNCIFBIWSBhdCBvbmNl CisJICogb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBwZGF0YQogCSAqLwogCWhzb3RnLT5waHkgPSBk ZXZtX3BoeV9nZXQoaHNvdGctPmRldiwgInVzYjItcGh5Iik7CisJaHNvdGctPnVwaHkgPSBkZXZt X3VzYl9nZXRfcGh5KGhzb3RnLT5kZXYsIFVTQl9QSFlfVFlQRV9VU0IyKTsKIAlpZiAoSVNfRVJS KGhzb3RnLT5waHkpKSB7CiAJCXJldCA9IFBUUl9FUlIoaHNvdGctPnBoeSk7CiAJCXN3aXRjaCAo cmV0KSB7CkBAIC0yMzcsMjkgKzIzOCwzNCBAQCBzdGF0aWMgaW50IGR3YzJfbG93bGV2ZWxfaHdf aW5pdChzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCiAJCQloc290Zy0+cGh5ID0gTlVMTDsKIAkJ CWJyZWFrOwogCQljYXNlIC1FUFJPQkVfREVGRVI6Ci0JCQlyZXR1cm4gcmV0OworCQkJaWYgKElT X0VSUihoc290Zy0+dXBoeSkpCisJCQkJcmV0dXJuIHJldDsKKworCQkJaHNvdGctPnBoeSA9IE5V TEw7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl9lcnIoaHNvdGctPmRldiwgImVycm9y IGdldHRpbmcgcGh5ICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAotCWlm ICghaHNvdGctPnBoeSkgewotCQloc290Zy0+dXBoeSA9IGRldm1fdXNiX2dldF9waHkoaHNvdGct PmRldiwgVVNCX1BIWV9UWVBFX1VTQjIpOwotCQlpZiAoSVNfRVJSKGhzb3RnLT51cGh5KSkgewot CQkJcmV0ID0gUFRSX0VSUihoc290Zy0+dXBoeSk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2Fz ZSAtRU5PREVWOgotCQkJY2FzZSAtRU5YSU86Ci0JCQkJaHNvdGctPnVwaHkgPSBOVUxMOwotCQkJ CWJyZWFrOwotCQkJY2FzZSAtRVBST0JFX0RFRkVSOgotCQkJCXJldHVybiByZXQ7Ci0JCQlkZWZh dWx0OgotCQkJCWRldl9lcnIoaHNvdGctPmRldiwgImVycm9yIGdldHRpbmcgdXNiIHBoeSAlZFxu IiwKLQkJCQkJcmV0KTsKKwlpZiAoSVNfRVJSKGhzb3RnLT51cGh5KSkgeworCQlyZXQgPSBQVFJf RVJSKGhzb3RnLT51cGh5KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAtRU5PREVWOgorCQlj YXNlIC1FTlhJTzoKKwkJCWhzb3RnLT51cGh5ID0gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIC1F UFJPQkVfREVGRVI6CisJCQlpZiAoIWhzb3RnLT5waHkpCiAJCQkJcmV0dXJuIHJldDsKLQkJCX0K KworCQkJaHNvdGctPnVwaHkgPSBOVUxMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZf ZXJyKGhzb3RnLT5kZXYsICJlcnJvciBnZXR0aW5nIHVzYiBwaHkgJWRcbiIsCisJCQkJcmV0KTsK KwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAK From mboxrd@z Thu Jan 1 00:00:00 1970 From: stefan.wahren@i2se.com (Stefan Wahren) Date: Tue, 9 Jan 2018 20:28:54 +0100 Subject: [PATCH] usb: dwc2: Fix endless deferral probe Message-ID: <1515526134-2148-1-git-send-email-stefan.wahren@i2se.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org The dwc2 USB driver tries to find a generic PHY first and then look for an old style USB PHY. In case of a valid generic PHY node without a PHY driver, the PHY layer will return -EPROBE_DEFER forever. So dwc2 will never tries for an USB PHY. Fix this issue by finding a generic PHY and an old style USB PHY at once. Fixes: 6c2dad69163f ("usb: dwc2: Return errors from PHY") Link: https://marc.info/?l=linux-usb&m=151518314314753&w=2 Signed-off-by: Stefan Wahren --- drivers/usb/dwc2/platform.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index 3e26550..5279567 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c @@ -225,10 +225,11 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) hsotg->phyif = GUSBCFG_PHYIF16; /* - * Attempt to find a generic PHY, then look for an old style - * USB PHY and then fall back to pdata + * Attempt to find a generic PHY or an old style USB PHY at once + * otherwise fall back to pdata */ hsotg->phy = devm_phy_get(hsotg->dev, "usb2-phy"); + hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); if (IS_ERR(hsotg->phy)) { ret = PTR_ERR(hsotg->phy); switch (ret) { @@ -237,29 +238,34 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) hsotg->phy = NULL; break; case -EPROBE_DEFER: - return ret; + if (IS_ERR(hsotg->uphy)) + return ret; + + hsotg->phy = NULL; + break; default: dev_err(hsotg->dev, "error getting phy %d\n", ret); return ret; } } - if (!hsotg->phy) { - hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); - if (IS_ERR(hsotg->uphy)) { - ret = PTR_ERR(hsotg->uphy); - switch (ret) { - case -ENODEV: - case -ENXIO: - hsotg->uphy = NULL; - break; - case -EPROBE_DEFER: - return ret; - default: - dev_err(hsotg->dev, "error getting usb phy %d\n", - ret); + if (IS_ERR(hsotg->uphy)) { + ret = PTR_ERR(hsotg->uphy); + switch (ret) { + case -ENODEV: + case -ENXIO: + hsotg->uphy = NULL; + break; + case -EPROBE_DEFER: + if (!hsotg->phy) return ret; - } + + hsotg->uphy = NULL; + break; + default: + dev_err(hsotg->dev, "error getting usb phy %d\n", + ret); + return ret; } } -- 2.7.4