]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/usb/host/xhci-omap.c
arm: am57xx: cl-som-am57x: invoke clock API to enable/disable clocks
[people/ms/u-boot.git] / drivers / usb / host / xhci-omap.c
index 912b2bd8d582258c1898e3272a98e3510dd7873c..d6c5744818404d30073bda0f3062b507c0284f9e 100644 (file)
@@ -11,7 +11,7 @@
 
 #include <common.h>
 #include <usb.h>
-#include <asm-generic/errno.h>
+#include <linux/errno.h>
 #include <asm/omap_common.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/sys_proto.h>
@@ -27,71 +27,26 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static struct omap_xhci omap;
 
-inline int __board_usb_init(int index, enum usb_init_type init)
+__weak int omap_xhci_board_usb_init(int index, enum usb_init_type init)
 {
+       enable_usb_clocks(index);
        return 0;
 }
-int board_usb_init(int index, enum usb_init_type init)
-       __attribute__((weak, alias("__board_usb_init")));
 
-static void dwc3_set_mode(struct dwc3 *dwc3_reg, u32 mode)
+int board_usb_init(int index, enum usb_init_type init)
 {
-       clrsetbits_le32(&dwc3_reg->g_ctl,
-                       DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG),
-                       DWC3_GCTL_PRTCAPDIR(mode));
+       return omap_xhci_board_usb_init(index, init);
 }
 
-static void dwc3_core_soft_reset(struct dwc3 *dwc3_reg)
+__weak int omap_xhci_board_usb_cleanup(int index, enum usb_init_type init)
 {
-       /* Before Resetting PHY, put Core in Reset */
-       setbits_le32(&dwc3_reg->g_ctl, DWC3_GCTL_CORESOFTRESET);
-
-       omap_reset_usb_phy(dwc3_reg);
-
-       /* After PHYs are stable we can take Core out of reset state */
-       clrbits_le32(&dwc3_reg->g_ctl, DWC3_GCTL_CORESOFTRESET);
+       disable_usb_clocks(index);
+       return 0;
 }
 
-static int dwc3_core_init(struct dwc3 *dwc3_reg)
+int board_usb_cleanup(int index, enum usb_init_type init)
 {
-       u32 reg;
-       u32 revision;
-       unsigned int dwc3_hwparams1;
-
-       revision = readl(&dwc3_reg->g_snpsid);
-       /* This should read as U3 followed by revision number */
-       if ((revision & DWC3_GSNPSID_MASK) != 0x55330000) {
-               puts("this is not a DesignWare USB3 DRD Core\n");
-               return -1;
-       }
-
-       dwc3_core_soft_reset(dwc3_reg);
-
-       dwc3_hwparams1 = readl(&dwc3_reg->g_hwparams1);
-
-       reg = readl(&dwc3_reg->g_ctl);
-       reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
-       reg &= ~DWC3_GCTL_DISSCRAMBLE;
-       switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc3_hwparams1)) {
-       case DWC3_GHWPARAMS1_EN_PWROPT_CLK:
-               reg &= ~DWC3_GCTL_DSBLCLKGTNG;
-               break;
-       default:
-               debug("No power optimization available\n");
-       }
-
-       /*
-        * WORKAROUND: DWC3 revisions <1.90a have a bug
-        * where the device can fail to connect at SuperSpeed
-        * and falls back to high-speed mode which causes
-        * the device to enter a Connect/Disconnect loop
-        */
-       if ((revision & DWC3_REVISION_MASK) < 0x190a)
-               reg |= DWC3_GCTL_U2RSTECN;
-
-       writel(reg, &dwc3_reg->g_ctl);
-
-       return 0;
+       return omap_xhci_board_usb_cleanup(index, init);
 }
 
 static int omap_xhci_core_init(struct omap_xhci *omap)
@@ -156,4 +111,5 @@ void xhci_hcd_stop(int index)
        struct omap_xhci *ctx = &omap;
 
        omap_xhci_core_exit(ctx);
+       board_usb_cleanup(index, USB_INIT_HOST);
 }