|
@@ -91,6 +91,8 @@
|
|
|
|
|
|
|
|
|
struct usbhs_hcd_omap {
|
|
|
+ int nports;
|
|
|
+
|
|
|
struct clk *xclk60mhsp1_ck;
|
|
|
struct clk *xclk60mhsp2_ck;
|
|
|
struct clk *utmi_p1_fck;
|
|
@@ -347,8 +349,6 @@ static void omap_usbhs_init(struct device *dev)
|
|
|
|
|
|
pm_runtime_get_sync(dev);
|
|
|
spin_lock_irqsave(&omap->lock, flags);
|
|
|
- omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
|
|
|
- dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev);
|
|
|
|
|
|
reg = usbhs_read(omap->uhh_base, OMAP_UHH_HOSTCONFIG);
|
|
|
/* setup ULPI bypass and burst configurations */
|
|
@@ -483,7 +483,32 @@ static int usbhs_omap_probe(struct platform_device *pdev)
|
|
|
|
|
|
pm_runtime_enable(dev);
|
|
|
|
|
|
- for (i = 0; i < OMAP3_HS_USB_PORTS; i++)
|
|
|
+ platform_set_drvdata(pdev, omap);
|
|
|
+ pm_runtime_get_sync(dev);
|
|
|
+
|
|
|
+ omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
|
|
|
+
|
|
|
+ /* we need to call runtime suspend before we update omap->nports
|
|
|
+ * to prevent unbalanced clk_disable()
|
|
|
+ */
|
|
|
+ pm_runtime_put_sync(dev);
|
|
|
+
|
|
|
+ switch (omap->usbhs_rev) {
|
|
|
+ case OMAP_USBHS_REV1:
|
|
|
+ omap->nports = 3;
|
|
|
+ break;
|
|
|
+ case OMAP_USBHS_REV2:
|
|
|
+ omap->nports = 2;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ omap->nports = OMAP3_HS_USB_PORTS;
|
|
|
+ dev_dbg(dev,
|
|
|
+ "USB HOST Rev : 0x%d not recognized, assuming %d ports\n",
|
|
|
+ omap->usbhs_rev, omap->nports);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < omap->nports; i++)
|
|
|
if (is_ehci_phy_mode(i) || is_ehci_tll_mode(i) ||
|
|
|
is_ehci_hsic_mode(i)) {
|
|
|
omap->ehci_logic_fck = clk_get(dev, "ehci_logic_fck");
|
|
@@ -573,8 +598,6 @@ static int usbhs_omap_probe(struct platform_device *pdev)
|
|
|
"failed error:%d\n", ret);
|
|
|
}
|
|
|
|
|
|
- platform_set_drvdata(pdev, omap);
|
|
|
-
|
|
|
omap_usbhs_init(dev);
|
|
|
ret = omap_usbhs_alloc_children(pdev);
|
|
|
if (ret) {
|