diff options
Diffstat (limited to 'drivers/usb/host/ehci-tegra.c')
| -rw-r--r-- | drivers/usb/host/ehci-tegra.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 1d2488cc55f..ed201ae879c 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -28,6 +28,7 @@  #include <linux/pm_runtime.h>  #include <linux/usb/ehci_def.h>  #include <linux/usb/tegra_usb_phy.h> +#include <linux/clk/tegra.h>  #define TEGRA_USB_BASE			0xC5000000  #define TEGRA_USB2_BASE			0xC5004000 @@ -691,6 +692,10 @@ static int tegra_ehci_probe(struct platform_device *pdev)  	if (err)  		goto fail_clk; +	tegra_periph_reset_assert(tegra->clk); +	udelay(1); +	tegra_periph_reset_deassert(tegra->clk); +  	tegra->needs_double_reset = of_property_read_bool(pdev->dev.of_node,  		"nvidia,needs-double-reset"); @@ -755,7 +760,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)  	err = usb_phy_set_suspend(hcd->phy, 0);  	if (err) {  		dev_err(&pdev->dev, "Failed to power on the phy\n"); -		goto fail; +		goto fail_phy;  	}  	tegra->host_resumed = 1; @@ -765,7 +770,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)  	if (!irq) {  		dev_err(&pdev->dev, "Failed to get IRQ\n");  		err = -ENODEV; -		goto fail; +		goto fail_phy;  	}  	if (pdata->operating_mode == TEGRA_USB_OTG) { @@ -773,6 +778,8 @@ static int tegra_ehci_probe(struct platform_device *pdev)  			devm_usb_get_phy(&pdev->dev, USB_PHY_TYPE_USB2);  		if (!IS_ERR(tegra->transceiver))  			otg_set_host(tegra->transceiver->otg, &hcd->self); +	} else { +		tegra->transceiver = ERR_PTR(-ENODEV);  	}  	err = usb_add_hcd(hcd, irq, IRQF_SHARED); @@ -794,6 +801,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)  fail:  	if (!IS_ERR(tegra->transceiver))  		otg_set_host(tegra->transceiver->otg, NULL); +fail_phy:  	usb_phy_shutdown(hcd->phy);  fail_io:  	clk_disable_unprepare(tegra->clk);  |