| From f8a15a9650694feaa0dabf197b0c94d37cd3fb42 Mon Sep 17 00:00:00 2001 |
| From: Thierry Reding <treding@nvidia.com> |
| Date: Thu, 26 May 2016 17:23:29 +0200 |
| Subject: usb: host: ehci-tegra: Grab the correct UTMI pads reset |
| |
| From: Thierry Reding <treding@nvidia.com> |
| |
| commit f8a15a9650694feaa0dabf197b0c94d37cd3fb42 upstream. |
| |
| There are three EHCI controllers on Tegra SoCs, each with its own reset |
| line. However, the first controller contains a set of UTMI configuration |
| registers that are shared with its siblings. These registers will only |
| be reset as part of the first controller's reset. For proper operation |
| it must be ensured that the UTMI configuration registers are reset |
| before any of the EHCI controllers are enabled, irrespective of the |
| probe order. |
| |
| Commit a47cc24cd1e5 ("USB: EHCI: tegra: Fix probe order issue leading to |
| broken USB") introduced code that ensures the first controller is always |
| reset before setting up any of the controllers, and is never again reset |
| afterwards. |
| |
| This code, however, grabs the wrong reset. Each EHCI controller has two |
| reset controls attached: 1) the USB controller reset and 2) the UTMI |
| pads reset (really the first controller's reset). In order to reset the |
| UTMI pads registers the code must grab the second reset, but instead it |
| grabbing the first. |
| |
| Fixes: a47cc24cd1e5 ("USB: EHCI: tegra: Fix probe order issue leading to broken USB") |
| Acked-by: Jon Hunter <jonathanh@nvidia.com> |
| Signed-off-by: Thierry Reding <treding@nvidia.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/host/ehci-tegra.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/usb/host/ehci-tegra.c |
| +++ b/drivers/usb/host/ehci-tegra.c |
| @@ -89,7 +89,7 @@ static int tegra_reset_usb_controller(st |
| if (!usb1_reset_attempted) { |
| struct reset_control *usb1_reset; |
| |
| - usb1_reset = of_reset_control_get(phy_np, "usb"); |
| + usb1_reset = of_reset_control_get(phy_np, "utmi-pads"); |
| if (IS_ERR(usb1_reset)) { |
| dev_warn(&pdev->dev, |
| "can't get utmi-pads reset from the PHY\n"); |