usb: host: tegra: Resetting PORT0 based on information received via DT.
authorVenu Byravarasu <vbyravarasu@nvidia.com>
Thu, 13 Dec 2012 20:59:08 +0000 (20:59 +0000)
committerStephen Warren <swarren@nvidia.com>
Mon, 28 Jan 2013 18:20:05 +0000 (11:20 -0700)
Tegra USB host driver is using port instance number,
to handle some of the hardware issues on SOC e.g. reset PORT0
twice etc. As instance number based handling looks ugly,
making use of information passed through DT for achieving this.

Signed-off-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
drivers/usb/host/ehci-tegra.c

index acf17556bd87b87b7bb3cc1a1c5a167ec15d1f7c..55a9cdee2949f70cc5bbf8f74d594fbf2cb4d2f9 100644 (file)
@@ -43,6 +43,7 @@ struct tegra_ehci_hcd {
        struct usb_phy *transceiver;
        int host_resumed;
        int port_resuming;
+       bool needs_double_reset;
        enum tegra_usb_phy_port_speed port_speed;
 };
 
@@ -184,7 +185,7 @@ static int tegra_ehci_hub_control(
        }
 
        /* For USB1 port we need to issue Port Reset twice internally */
-       if (tegra->phy->instance == 0 &&
+       if (tegra->needs_double_reset &&
           (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_RESET)) {
                spin_unlock_irqrestore(&ehci->lock, flags);
                return tegra_ehci_internal_port_reset(ehci, status_reg);
@@ -666,6 +667,9 @@ static int tegra_ehci_probe(struct platform_device *pdev)
        clk_prepare_enable(tegra->emc_clk);
        clk_set_rate(tegra->emc_clk, 400000000);
 
+       tegra->needs_double_reset = of_property_read_bool(pdev->dev.of_node,
+               "nvidia,needs-double-reset");
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(&pdev->dev, "Failed to get I/O memory\n");