|
@@ -1054,10 +1054,23 @@ static int tegra_xusb_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ tegra->hcd = usb_create_hcd(&tegra_xhci_hc_driver, &pdev->dev,
|
|
|
+ dev_name(&pdev->dev));
|
|
|
+ if (!tegra->hcd) {
|
|
|
+ err = -ENOMEM;
|
|
|
+ goto put_padctl;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * This must happen after usb_create_hcd(), because usb_create_hcd()
|
|
|
+ * will overwrite the drvdata of the device with the hcd it creates.
|
|
|
+ */
|
|
|
+ platform_set_drvdata(pdev, tegra);
|
|
|
+
|
|
|
err = tegra_xusb_clk_enable(tegra);
|
|
|
if (err) {
|
|
|
dev_err(&pdev->dev, "failed to enable clocks: %d\n", err);
|
|
|
- goto put_padctl;
|
|
|
+ goto put_usb2;
|
|
|
}
|
|
|
|
|
|
err = regulator_bulk_enable(tegra->soc->num_supplies, tegra->supplies);
|
|
@@ -1080,19 +1093,6 @@ static int tegra_xusb_probe(struct platform_device *pdev)
|
|
|
goto disable_phy;
|
|
|
}
|
|
|
|
|
|
- tegra->hcd = usb_create_hcd(&tegra_xhci_hc_driver, &pdev->dev,
|
|
|
- dev_name(&pdev->dev));
|
|
|
- if (!tegra->hcd) {
|
|
|
- err = -ENOMEM;
|
|
|
- goto disable_phy;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * This must happen after usb_create_hcd(), because usb_create_hcd()
|
|
|
- * will overwrite the drvdata of the device with the hcd it creates.
|
|
|
- */
|
|
|
- platform_set_drvdata(pdev, tegra);
|
|
|
-
|
|
|
tegra->hcd->regs = tegra->regs;
|
|
|
tegra->hcd->rsrc_start = regs->start;
|
|
|
tegra->hcd->rsrc_len = resource_size(regs);
|
|
@@ -1100,7 +1100,7 @@ static int tegra_xusb_probe(struct platform_device *pdev)
|
|
|
err = usb_add_hcd(tegra->hcd, tegra->xhci_irq, IRQF_SHARED);
|
|
|
if (err < 0) {
|
|
|
dev_err(&pdev->dev, "failed to add USB HCD: %d\n", err);
|
|
|
- goto put_usb2;
|
|
|
+ goto disable_phy;
|
|
|
}
|
|
|
|
|
|
device_wakeup_enable(tegra->hcd->self.controller);
|
|
@@ -1155,14 +1155,14 @@ put_usb3:
|
|
|
usb_put_hcd(xhci->shared_hcd);
|
|
|
remove_usb2:
|
|
|
usb_remove_hcd(tegra->hcd);
|
|
|
-put_usb2:
|
|
|
- usb_put_hcd(tegra->hcd);
|
|
|
disable_phy:
|
|
|
tegra_xusb_phy_disable(tegra);
|
|
|
disable_regulator:
|
|
|
regulator_bulk_disable(tegra->soc->num_supplies, tegra->supplies);
|
|
|
disable_clk:
|
|
|
tegra_xusb_clk_disable(tegra);
|
|
|
+put_usb2:
|
|
|
+ usb_put_hcd(tegra->hcd);
|
|
|
put_padctl:
|
|
|
tegra_xusb_padctl_put(tegra->padctl);
|
|
|
return err;
|