|
@@ -14,6 +14,13 @@
|
|
|
|
|
|
#include "mux_data.h"
|
|
|
|
|
|
+#ifdef CONFIG_USB_EHCI
|
|
|
+#include <usb.h>
|
|
|
+#include <asm/arch/clock.h>
|
|
|
+#include <asm/arch/ehci.h>
|
|
|
+#include <asm/ehci-omap.h>
|
|
|
+#endif
|
|
|
+
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
const struct omap_sysinfo sysinfo = {
|
|
@@ -109,3 +116,56 @@ int board_mmc_init(bd_t *bis)
|
|
|
return 0;
|
|
|
}
|
|
|
#endif
|
|
|
+
|
|
|
+#ifdef CONFIG_USB_EHCI
|
|
|
+static struct omap_usbhs_board_data usbhs_bdata = {
|
|
|
+ .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
|
|
|
+ .port_mode[1] = OMAP_EHCI_PORT_MODE_HSIC,
|
|
|
+ .port_mode[2] = OMAP_EHCI_PORT_MODE_HSIC,
|
|
|
+};
|
|
|
+
|
|
|
+static void enable_host_clocks(void)
|
|
|
+{
|
|
|
+ int hs_clk_ctrl_val = (OPTFCLKEN_HSIC60M_P3_CLK |
|
|
|
+ OPTFCLKEN_HSIC480M_P3_CLK |
|
|
|
+ OPTFCLKEN_HSIC60M_P2_CLK |
|
|
|
+ OPTFCLKEN_HSIC480M_P2_CLK |
|
|
|
+ OPTFCLKEN_UTMI_P3_CLK | OPTFCLKEN_UTMI_P2_CLK);
|
|
|
+
|
|
|
+ /* Enable port 2 and 3 clocks*/
|
|
|
+ setbits_le32((*prcm)->cm_l3init_hsusbhost_clkctrl, hs_clk_ctrl_val);
|
|
|
+
|
|
|
+ /* Enable port 2 and 3 usb host ports tll clocks*/
|
|
|
+ setbits_le32((*prcm)->cm_l3init_hsusbtll_clkctrl,
|
|
|
+ (OPTFCLKEN_USB_CH1_CLK_ENABLE | OPTFCLKEN_USB_CH2_CLK_ENABLE));
|
|
|
+}
|
|
|
+
|
|
|
+int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ int auxclk;
|
|
|
+
|
|
|
+ enable_host_clocks();
|
|
|
+
|
|
|
+ auxclk = readl((*prcm)->scrm_auxclk1);
|
|
|
+ /* Request auxilary clock */
|
|
|
+ auxclk |= AUXCLK_ENABLE_MASK;
|
|
|
+ writel(auxclk, (*prcm)->scrm_auxclk1);
|
|
|
+
|
|
|
+ ret = omap_ehci_hcd_init(&usbhs_bdata, hccr, hcor);
|
|
|
+ if (ret < 0) {
|
|
|
+ puts("Failed to initialize ehci\n");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int ehci_hcd_stop(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = omap_ehci_hcd_stop();
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+#endif
|