From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martin Blumenstingl Subject: [PATCH usb-next v2 2/3] usb: dwc3: of-simple: add support for shared and pulsed reset lines Date: Sun, 11 Feb 2018 22:15:16 +0100 Message-ID: <20180211211517.5846-3-martin.blumenstingl@googlemail.com> References: <20180211211517.5846-1-martin.blumenstingl@googlemail.com> Return-path: In-Reply-To: <20180211211517.5846-1-martin.blumenstingl-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> Sender: devicetree-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org, balbi-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, mark.rutland-5wv7dgnIgG8@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, yixun.lan-LpR1jeaWuhtBDgjK7y7TUQ@public.gmane.org, Martin Blumenstingl List-Id: devicetree@vger.kernel.org Some SoCs (such as Amlogic Meson GXL for example) share the reset line with other components (in case of the Meson GXL example there's a shared reset line between the USB2 PHYs, USB3 PHYs and the dwc3 controller). Additionally SoC implementations may prefer a reset pulse over level resets. For now this falls back to the old defaults, which are: - reset lines are exclusive - level resets are being used Signed-off-by: Martin Blumenstingl Tested-by: Yixun Lan --- drivers/usb/dwc3/dwc3-of-simple.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 7ae0eefc7cc7..d2e4928c8d62 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c @@ -27,6 +27,7 @@ struct dwc3_of_simple { struct clk **clks; int num_clocks; struct reset_control *resets; + bool pulse_resets; }; static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count) @@ -83,6 +84,7 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) int ret; int i; + bool shared_resets = false; simple = devm_kzalloc(dev, sizeof(*simple), GFP_KERNEL); if (!simple) @@ -91,16 +93,22 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) platform_set_drvdata(pdev, simple); simple->dev = dev; - simple->resets = of_reset_control_array_get_optional_exclusive(np); + simple->resets = of_reset_control_array_get(np, shared_resets, true); if (IS_ERR(simple->resets)) { ret = PTR_ERR(simple->resets); dev_err(dev, "failed to get device resets, err=%d\n", ret); return ret; } - ret = reset_control_deassert(simple->resets); - if (ret) - goto err_resetc_put; + if (simple->pulse_resets) { + ret = reset_control_reset(simple->resets); + if (ret) + goto err_resetc_put; + } else { + ret = reset_control_deassert(simple->resets); + if (ret) + goto err_resetc_put; + } ret = dwc3_of_simple_clk_init(simple, of_count_phandle_with_args(np, "clocks", "#clock-cells")); @@ -124,7 +132,8 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) return 0; err_resetc_assert: - reset_control_assert(simple->resets); + if (!simple->pulse_resets) + reset_control_assert(simple->resets); err_resetc_put: reset_control_put(simple->resets); @@ -144,7 +153,9 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) clk_put(simple->clks[i]); } - reset_control_assert(simple->resets); + if (!simple->pulse_resets) + reset_control_assert(simple->resets); + reset_control_put(simple->resets); pm_runtime_put_sync(dev); -- 2.16.1 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html 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-next,v2,2/3] usb: dwc3: of-simple: add support for shared and pulsed reset lines From: Martin Blumenstingl Message-Id: <20180211211517.5846-3-martin.blumenstingl@googlemail.com> Date: Sun, 11 Feb 2018 22:15:16 +0100 To: gregkh@linuxfoundation.org, balbi@kernel.org, linux-usb@vger.kernel.org Cc: robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, linux-amlogic@lists.infradead.org, yixun.lan@amlogic.com, Martin Blumenstingl List-ID: U29tZSBTb0NzIChzdWNoIGFzIEFtbG9naWMgTWVzb24gR1hMIGZvciBleGFtcGxlKSBzaGFyZSB0 aGUgcmVzZXQgbGluZQp3aXRoIG90aGVyIGNvbXBvbmVudHMgKGluIGNhc2Ugb2YgdGhlIE1lc29u IEdYTCBleGFtcGxlIHRoZXJlJ3MgYSBzaGFyZWQKcmVzZXQgbGluZSBiZXR3ZWVuIHRoZSBVU0Iy IFBIWXMsIFVTQjMgUEhZcyBhbmQgdGhlIGR3YzMgY29udHJvbGxlcikuCkFkZGl0aW9uYWxseSBT b0MgaW1wbGVtZW50YXRpb25zIG1heSBwcmVmZXIgYSByZXNldCBwdWxzZSBvdmVyIGxldmVsCnJl c2V0cy4KCkZvciBub3cgdGhpcyBmYWxscyBiYWNrIHRvIHRoZSBvbGQgZGVmYXVsdHMsIHdoaWNo IGFyZToKLSByZXNldCBsaW5lcyBhcmUgZXhjbHVzaXZlCi0gbGV2ZWwgcmVzZXRzIGFyZSBiZWlu ZyB1c2VkCgpTaWduZWQtb2ZmLWJ5OiBNYXJ0aW4gQmx1bWVuc3RpbmdsIDxtYXJ0aW4uYmx1bWVu c3RpbmdsQGdvb2dsZW1haWwuY29tPgpUZXN0ZWQtYnk6IFlpeHVuIExhbiA8eWl4dW4ubGFuQGFt bG9naWMuY29tPgotLS0KIGRyaXZlcnMvdXNiL2R3YzMvZHdjMy1vZi1zaW1wbGUuYyB8IDIzICsr KysrKysrKysrKysrKysrLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTcgaW5zZXJ0aW9ucygrKSwg NiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2lt cGxlLmMgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2ltcGxlLmMKaW5kZXggN2FlMGVlZmM3 Y2M3Li5kMmU0OTI4YzhkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vZi1z aW1wbGUuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2ltcGxlLmMKQEAgLTI3LDYg KzI3LDcgQEAgc3RydWN0IGR3YzNfb2Zfc2ltcGxlIHsKIAlzdHJ1Y3QgY2xrCQkqKmNsa3M7CiAJ aW50CQkJbnVtX2Nsb2NrczsKIAlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcmVzZXRzOworCWJvb2wJ CQlwdWxzZV9yZXNldHM7CiB9OwogCiBzdGF0aWMgaW50IGR3YzNfb2Zfc2ltcGxlX2Nsa19pbml0 KHN0cnVjdCBkd2MzX29mX3NpbXBsZSAqc2ltcGxlLCBpbnQgY291bnQpCkBAIC04Myw2ICs4NCw3 IEBAIHN0YXRpYyBpbnQgZHdjM19vZl9zaW1wbGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKIAogCWludAkJCXJldDsKIAlpbnQJCQlpOworCWJvb2wJCQlzaGFyZWRfcmVzZXRz ID0gZmFsc2U7CiAKIAlzaW1wbGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNpbXBsZSks IEdGUF9LRVJORUwpOwogCWlmICghc2ltcGxlKQpAQCAtOTEsMTYgKzkzLDIyIEBAIHN0YXRpYyBp bnQgZHdjM19vZl9zaW1wbGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAlw bGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzaW1wbGUpOwogCXNpbXBsZS0+ZGV2ID0gZGV2Owog Ci0Jc2ltcGxlLT5yZXNldHMgPSBvZl9yZXNldF9jb250cm9sX2FycmF5X2dldF9vcHRpb25hbF9l eGNsdXNpdmUobnApOworCXNpbXBsZS0+cmVzZXRzID0gb2ZfcmVzZXRfY29udHJvbF9hcnJheV9n ZXQobnAsIHNoYXJlZF9yZXNldHMsIHRydWUpOwogCWlmIChJU19FUlIoc2ltcGxlLT5yZXNldHMp KSB7CiAJCXJldCA9IFBUUl9FUlIoc2ltcGxlLT5yZXNldHMpOwogCQlkZXZfZXJyKGRldiwgImZh aWxlZCB0byBnZXQgZGV2aWNlIHJlc2V0cywgZXJyPSVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0 OwogCX0KIAotCXJldCA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoc2ltcGxlLT5yZXNldHMpOwot CWlmIChyZXQpCi0JCWdvdG8gZXJyX3Jlc2V0Y19wdXQ7CisJaWYgKHNpbXBsZS0+cHVsc2VfcmVz ZXRzKSB7CisJCXJldCA9IHJlc2V0X2NvbnRyb2xfcmVzZXQoc2ltcGxlLT5yZXNldHMpOworCQlp ZiAocmV0KQorCQkJZ290byBlcnJfcmVzZXRjX3B1dDsKKwl9IGVsc2UgeworCQlyZXQgPSByZXNl dF9jb250cm9sX2RlYXNzZXJ0KHNpbXBsZS0+cmVzZXRzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8g ZXJyX3Jlc2V0Y19wdXQ7CisJfQogCiAJcmV0ID0gZHdjM19vZl9zaW1wbGVfY2xrX2luaXQoc2lt cGxlLCBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhucCwKIAkJCQkJCSJjbG9ja3MiLCAiI2Ns b2NrLWNlbGxzIikpOwpAQCAtMTI0LDcgKzEzMiw4IEBAIHN0YXRpYyBpbnQgZHdjM19vZl9zaW1w bGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAlyZXR1cm4gMDsKIAogZXJy X3Jlc2V0Y19hc3NlcnQ6Ci0JcmVzZXRfY29udHJvbF9hc3NlcnQoc2ltcGxlLT5yZXNldHMpOwor CWlmICghc2ltcGxlLT5wdWxzZV9yZXNldHMpCisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHNpbXBs ZS0+cmVzZXRzKTsKIAogZXJyX3Jlc2V0Y19wdXQ6CiAJcmVzZXRfY29udHJvbF9wdXQoc2ltcGxl LT5yZXNldHMpOwpAQCAtMTQ0LDcgKzE1Myw5IEBAIHN0YXRpYyBpbnQgZHdjM19vZl9zaW1wbGVf cmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCWNsa19wdXQoc2ltcGxlLT5j bGtzW2ldKTsKIAl9CiAKLQlyZXNldF9jb250cm9sX2Fzc2VydChzaW1wbGUtPnJlc2V0cyk7CisJ aWYgKCFzaW1wbGUtPnB1bHNlX3Jlc2V0cykKKwkJcmVzZXRfY29udHJvbF9hc3NlcnQoc2ltcGxl LT5yZXNldHMpOworCiAJcmVzZXRfY29udHJvbF9wdXQoc2ltcGxlLT5yZXNldHMpOwogCiAJcG1f cnVudGltZV9wdXRfc3luYyhkZXYpOwo= From mboxrd@z Thu Jan 1 00:00:00 1970 From: martin.blumenstingl@googlemail.com (Martin Blumenstingl) Date: Sun, 11 Feb 2018 22:15:16 +0100 Subject: [PATCH usb-next v2 2/3] usb: dwc3: of-simple: add support for shared and pulsed reset lines In-Reply-To: <20180211211517.5846-1-martin.blumenstingl@googlemail.com> References: <20180211211517.5846-1-martin.blumenstingl@googlemail.com> Message-ID: <20180211211517.5846-3-martin.blumenstingl@googlemail.com> To: linus-amlogic@lists.infradead.org List-Id: linus-amlogic.lists.infradead.org Some SoCs (such as Amlogic Meson GXL for example) share the reset line with other components (in case of the Meson GXL example there's a shared reset line between the USB2 PHYs, USB3 PHYs and the dwc3 controller). Additionally SoC implementations may prefer a reset pulse over level resets. For now this falls back to the old defaults, which are: - reset lines are exclusive - level resets are being used Signed-off-by: Martin Blumenstingl Tested-by: Yixun Lan --- drivers/usb/dwc3/dwc3-of-simple.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 7ae0eefc7cc7..d2e4928c8d62 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c @@ -27,6 +27,7 @@ struct dwc3_of_simple { struct clk **clks; int num_clocks; struct reset_control *resets; + bool pulse_resets; }; static int dwc3_of_simple_clk_init(struct dwc3_of_simple *simple, int count) @@ -83,6 +84,7 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) int ret; int i; + bool shared_resets = false; simple = devm_kzalloc(dev, sizeof(*simple), GFP_KERNEL); if (!simple) @@ -91,16 +93,22 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) platform_set_drvdata(pdev, simple); simple->dev = dev; - simple->resets = of_reset_control_array_get_optional_exclusive(np); + simple->resets = of_reset_control_array_get(np, shared_resets, true); if (IS_ERR(simple->resets)) { ret = PTR_ERR(simple->resets); dev_err(dev, "failed to get device resets, err=%d\n", ret); return ret; } - ret = reset_control_deassert(simple->resets); - if (ret) - goto err_resetc_put; + if (simple->pulse_resets) { + ret = reset_control_reset(simple->resets); + if (ret) + goto err_resetc_put; + } else { + ret = reset_control_deassert(simple->resets); + if (ret) + goto err_resetc_put; + } ret = dwc3_of_simple_clk_init(simple, of_count_phandle_with_args(np, "clocks", "#clock-cells")); @@ -124,7 +132,8 @@ static int dwc3_of_simple_probe(struct platform_device *pdev) return 0; err_resetc_assert: - reset_control_assert(simple->resets); + if (!simple->pulse_resets) + reset_control_assert(simple->resets); err_resetc_put: reset_control_put(simple->resets); @@ -144,7 +153,9 @@ static int dwc3_of_simple_remove(struct platform_device *pdev) clk_put(simple->clks[i]); } - reset_control_assert(simple->resets); + if (!simple->pulse_resets) + reset_control_assert(simple->resets); + reset_control_put(simple->resets); pm_runtime_put_sync(dev); -- 2.16.1