11ca56202SWolfgang Grandegger /* 21ca56202SWolfgang Grandegger * Copyright (c) 2009 Daniel Mack <daniel@caiaq.de> 31ca56202SWolfgang Grandegger * Copyright (C) 2010 Freescale Semiconductor, Inc. 41ca56202SWolfgang Grandegger * 51ca56202SWolfgang Grandegger * This program is free software; you can redistribute it and/or modify it 61ca56202SWolfgang Grandegger * under the terms of the GNU General Public License as published by the 71ca56202SWolfgang Grandegger * Free Software Foundation; either version 2 of the License, or (at your 81ca56202SWolfgang Grandegger * option) any later version. 91ca56202SWolfgang Grandegger * 101ca56202SWolfgang Grandegger * This program is distributed in the hope that it will be useful, but 111ca56202SWolfgang Grandegger * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 121ca56202SWolfgang Grandegger * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 131ca56202SWolfgang Grandegger * for more details. 141ca56202SWolfgang Grandegger */ 151ca56202SWolfgang Grandegger 161ca56202SWolfgang Grandegger #include <common.h> 171ca56202SWolfgang Grandegger #include <usb.h> 181ca56202SWolfgang Grandegger #include <errno.h> 191ca56202SWolfgang Grandegger #include <linux/compiler.h> 201ca56202SWolfgang Grandegger #include <usb/ehci-fsl.h> 211ca56202SWolfgang Grandegger #include <asm/io.h> 221ca56202SWolfgang Grandegger #include <asm/arch/imx-regs.h> 231ca56202SWolfgang Grandegger #include <asm/arch/clock.h> 241ca56202SWolfgang Grandegger #include <asm/arch/mx5x_pins.h> 251b80f270SMarek Vasut #include <asm/arch/iomux.h> 261ca56202SWolfgang Grandegger 271ca56202SWolfgang Grandegger #include "ehci.h" 281ca56202SWolfgang Grandegger 291ca56202SWolfgang Grandegger #define MX5_USBOTHER_REGS_OFFSET 0x800 301ca56202SWolfgang Grandegger 311ca56202SWolfgang Grandegger 321ca56202SWolfgang Grandegger #define MXC_OTG_OFFSET 0 331ca56202SWolfgang Grandegger #define MXC_H1_OFFSET 0x200 341ca56202SWolfgang Grandegger #define MXC_H2_OFFSET 0x400 35*2cfe0b8fSBenoît Thébaudeau #define MXC_H3_OFFSET 0x600 361ca56202SWolfgang Grandegger 371ca56202SWolfgang Grandegger #define MXC_USBCTRL_OFFSET 0 381ca56202SWolfgang Grandegger #define MXC_USB_PHY_CTR_FUNC_OFFSET 0x8 391ca56202SWolfgang Grandegger #define MXC_USB_PHY_CTR_FUNC2_OFFSET 0xc 401ca56202SWolfgang Grandegger #define MXC_USB_CTRL_1_OFFSET 0x10 411ca56202SWolfgang Grandegger #define MXC_USBH2CTRL_OFFSET 0x14 42*2cfe0b8fSBenoît Thébaudeau #define MXC_USBH3CTRL_OFFSET 0x18 431ca56202SWolfgang Grandegger 441ca56202SWolfgang Grandegger /* USB_CTRL */ 45bdc52020SBenoît Thébaudeau /* OTG wakeup intr enable */ 46bdc52020SBenoît Thébaudeau #define MXC_OTG_UCTRL_OWIE_BIT (1 << 27) 47bdc52020SBenoît Thébaudeau /* OTG power mask */ 48bdc52020SBenoît Thébaudeau #define MXC_OTG_UCTRL_OPM_BIT (1 << 24) 49bdc52020SBenoît Thébaudeau /* Host1 ULPI interrupt enable */ 50bdc52020SBenoît Thébaudeau #define MXC_H1_UCTRL_H1UIE_BIT (1 << 12) 51bdc52020SBenoît Thébaudeau /* HOST1 wakeup intr enable */ 52bdc52020SBenoît Thébaudeau #define MXC_H1_UCTRL_H1WIE_BIT (1 << 11) 53bdc52020SBenoît Thébaudeau /* HOST1 power mask */ 54bdc52020SBenoît Thébaudeau #define MXC_H1_UCTRL_H1PM_BIT (1 << 8) 551ca56202SWolfgang Grandegger 561ca56202SWolfgang Grandegger /* USB_PHY_CTRL_FUNC */ 57bdc52020SBenoît Thébaudeau /* OTG Disable Overcurrent Event */ 58bdc52020SBenoît Thébaudeau #define MXC_OTG_PHYCTRL_OC_DIS_BIT (1 << 8) 59bdc52020SBenoît Thébaudeau /* UH1 Disable Overcurrent Event */ 60bdc52020SBenoît Thébaudeau #define MXC_H1_OC_DIS_BIT (1 << 5) 611ca56202SWolfgang Grandegger 621ca56202SWolfgang Grandegger /* USBH2CTRL */ 63*2cfe0b8fSBenoît Thébaudeau #define MXC_H2_UCTRL_H2_OC_DIS_BIT (1 << 30) 641ca56202SWolfgang Grandegger #define MXC_H2_UCTRL_H2UIE_BIT (1 << 8) 651ca56202SWolfgang Grandegger #define MXC_H2_UCTRL_H2WIE_BIT (1 << 7) 661ca56202SWolfgang Grandegger #define MXC_H2_UCTRL_H2PM_BIT (1 << 4) 671ca56202SWolfgang Grandegger 68*2cfe0b8fSBenoît Thébaudeau /* USBH3CTRL */ 69*2cfe0b8fSBenoît Thébaudeau #define MXC_H3_UCTRL_H3_OC_DIS_BIT (1 << 30) 70*2cfe0b8fSBenoît Thébaudeau #define MXC_H3_UCTRL_H3UIE_BIT (1 << 8) 71*2cfe0b8fSBenoît Thébaudeau #define MXC_H3_UCTRL_H3WIE_BIT (1 << 7) 72*2cfe0b8fSBenoît Thébaudeau 731ca56202SWolfgang Grandegger /* USB_CTRL_1 */ 741ca56202SWolfgang Grandegger #define MXC_USB_CTRL_UH1_EXT_CLK_EN (1 << 25) 751ca56202SWolfgang Grandegger 760f8c86b5SMarek Vasut /* USB pin configuration */ 770f8c86b5SMarek Vasut #define USB_PAD_CONFIG (PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST | \ 780f8c86b5SMarek Vasut PAD_CTL_DRV_HIGH | PAD_CTL_100K_PU | \ 790f8c86b5SMarek Vasut PAD_CTL_HYS_ENABLE | PAD_CTL_PUE_PULL) 800f8c86b5SMarek Vasut 810f8c86b5SMarek Vasut #ifdef CONFIG_MX51 820f8c86b5SMarek Vasut /* 830f8c86b5SMarek Vasut * Configure the MX51 USB H1 IOMUX 840f8c86b5SMarek Vasut */ 850f8c86b5SMarek Vasut void setup_iomux_usb_h1(void) 860f8c86b5SMarek Vasut { 870f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_STP, IOMUX_CONFIG_ALT0); 880f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_STP, USB_PAD_CONFIG); 890f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_CLK, IOMUX_CONFIG_ALT0); 900f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_CLK, USB_PAD_CONFIG); 910f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DIR, IOMUX_CONFIG_ALT0); 920f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DIR, USB_PAD_CONFIG); 930f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_NXT, IOMUX_CONFIG_ALT0); 940f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_NXT, USB_PAD_CONFIG); 950f8c86b5SMarek Vasut 960f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA0, IOMUX_CONFIG_ALT0); 970f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA0, USB_PAD_CONFIG); 980f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA1, IOMUX_CONFIG_ALT0); 990f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA1, USB_PAD_CONFIG); 1000f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA2, IOMUX_CONFIG_ALT0); 1010f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA2, USB_PAD_CONFIG); 1020f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA3, IOMUX_CONFIG_ALT0); 1030f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA3, USB_PAD_CONFIG); 1040f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA4, IOMUX_CONFIG_ALT0); 1050f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA4, USB_PAD_CONFIG); 1060f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA5, IOMUX_CONFIG_ALT0); 1070f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA5, USB_PAD_CONFIG); 1080f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA6, IOMUX_CONFIG_ALT0); 1090f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA6, USB_PAD_CONFIG); 1100f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_USBH1_DATA7, IOMUX_CONFIG_ALT0); 1110f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_USBH1_DATA7, USB_PAD_CONFIG); 1120f8c86b5SMarek Vasut } 1130f8c86b5SMarek Vasut 1140f8c86b5SMarek Vasut /* 1150f8c86b5SMarek Vasut * Configure the MX51 USB H2 IOMUX 1160f8c86b5SMarek Vasut */ 1170f8c86b5SMarek Vasut void setup_iomux_usb_h2(void) 1180f8c86b5SMarek Vasut { 1190f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_A24, IOMUX_CONFIG_ALT2); 1200f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_A24, USB_PAD_CONFIG); 1210f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_A25, IOMUX_CONFIG_ALT2); 1220f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_A25, USB_PAD_CONFIG); 1230f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_A26, IOMUX_CONFIG_ALT2); 1240f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_A26, USB_PAD_CONFIG); 1250f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_A27, IOMUX_CONFIG_ALT2); 1260f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_A27, USB_PAD_CONFIG); 1270f8c86b5SMarek Vasut 1280f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D16, IOMUX_CONFIG_ALT2); 1290f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D16, USB_PAD_CONFIG); 1300f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D17, IOMUX_CONFIG_ALT2); 1310f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D17, USB_PAD_CONFIG); 1320f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D18, IOMUX_CONFIG_ALT2); 1330f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D18, USB_PAD_CONFIG); 1340f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D19, IOMUX_CONFIG_ALT2); 1350f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D19, USB_PAD_CONFIG); 1360f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D20, IOMUX_CONFIG_ALT2); 1370f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D20, USB_PAD_CONFIG); 1380f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D21, IOMUX_CONFIG_ALT2); 1390f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D21, USB_PAD_CONFIG); 1400f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D22, IOMUX_CONFIG_ALT2); 1410f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D22, USB_PAD_CONFIG); 1420f8c86b5SMarek Vasut mxc_request_iomux(MX51_PIN_EIM_D23, IOMUX_CONFIG_ALT2); 1430f8c86b5SMarek Vasut mxc_iomux_set_pad(MX51_PIN_EIM_D23, USB_PAD_CONFIG); 1440f8c86b5SMarek Vasut } 1450f8c86b5SMarek Vasut #endif 1460f8c86b5SMarek Vasut 1471ca56202SWolfgang Grandegger int mxc_set_usbcontrol(int port, unsigned int flags) 1481ca56202SWolfgang Grandegger { 1491ca56202SWolfgang Grandegger unsigned int v; 1501ca56202SWolfgang Grandegger void __iomem *usb_base = (void __iomem *)OTG_BASE_ADDR; 1511ca56202SWolfgang Grandegger void __iomem *usbother_base; 1521ca56202SWolfgang Grandegger int ret = 0; 1531ca56202SWolfgang Grandegger 1541ca56202SWolfgang Grandegger usbother_base = usb_base + MX5_USBOTHER_REGS_OFFSET; 1551ca56202SWolfgang Grandegger 1561ca56202SWolfgang Grandegger switch (port) { 1571ca56202SWolfgang Grandegger case 0: /* OTG port */ 1581ca56202SWolfgang Grandegger if (flags & MXC_EHCI_INTERNAL_PHY) { 1591ca56202SWolfgang Grandegger v = __raw_readl(usbother_base + 1601ca56202SWolfgang Grandegger MXC_USB_PHY_CTR_FUNC_OFFSET); 1611ca56202SWolfgang Grandegger if (flags & MXC_EHCI_POWER_PINS_ENABLED) 1621ca56202SWolfgang Grandegger /* OC/USBPWR is used */ 1631ca56202SWolfgang Grandegger v &= ~MXC_OTG_PHYCTRL_OC_DIS_BIT; 1647d42432dSBenoît Thébaudeau else 1657d42432dSBenoît Thébaudeau /* OC/USBPWR is not used */ 1667d42432dSBenoît Thébaudeau v |= MXC_OTG_PHYCTRL_OC_DIS_BIT; 1671ca56202SWolfgang Grandegger __raw_writel(v, usbother_base + 1681ca56202SWolfgang Grandegger MXC_USB_PHY_CTR_FUNC_OFFSET); 1691ca56202SWolfgang Grandegger 1701ca56202SWolfgang Grandegger v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET); 171661052f4SBenoît Thébaudeau #ifdef CONFIG_MX51 1721ca56202SWolfgang Grandegger if (flags & MXC_EHCI_POWER_PINS_ENABLED) 1731ca56202SWolfgang Grandegger v &= ~MXC_OTG_UCTRL_OPM_BIT; 174394c00dcSBenoît Thébaudeau else 175394c00dcSBenoît Thébaudeau v |= MXC_OTG_UCTRL_OPM_BIT; 176661052f4SBenoît Thébaudeau #endif 1771ca56202SWolfgang Grandegger __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET); 1781ca56202SWolfgang Grandegger } 1791ca56202SWolfgang Grandegger break; 180bdc52020SBenoît Thébaudeau case 1: /* Host 1 ULPI */ 1811ca56202SWolfgang Grandegger #ifdef CONFIG_MX51 1821ca56202SWolfgang Grandegger /* The clock for the USBH1 ULPI port will come externally 1831ca56202SWolfgang Grandegger from the PHY. */ 1841ca56202SWolfgang Grandegger v = __raw_readl(usbother_base + MXC_USB_CTRL_1_OFFSET); 1851ca56202SWolfgang Grandegger __raw_writel(v | MXC_USB_CTRL_UH1_EXT_CLK_EN, usbother_base + 1861ca56202SWolfgang Grandegger MXC_USB_CTRL_1_OFFSET); 1871ca56202SWolfgang Grandegger #endif 1881ca56202SWolfgang Grandegger 1891ca56202SWolfgang Grandegger v = __raw_readl(usbother_base + MXC_USBCTRL_OFFSET); 190661052f4SBenoît Thébaudeau #ifdef CONFIG_MX51 1911ca56202SWolfgang Grandegger if (flags & MXC_EHCI_POWER_PINS_ENABLED) 192bdc52020SBenoît Thébaudeau v &= ~MXC_H1_UCTRL_H1PM_BIT; /* H1 power mask unused */ 1931ca56202SWolfgang Grandegger else 194bdc52020SBenoît Thébaudeau v |= MXC_H1_UCTRL_H1PM_BIT; /* H1 power mask used */ 195661052f4SBenoît Thébaudeau #endif 1961ca56202SWolfgang Grandegger __raw_writel(v, usbother_base + MXC_USBCTRL_OFFSET); 1971ca56202SWolfgang Grandegger 1981ca56202SWolfgang Grandegger v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET); 1991ca56202SWolfgang Grandegger if (flags & MXC_EHCI_POWER_PINS_ENABLED) 2001ca56202SWolfgang Grandegger v &= ~MXC_H1_OC_DIS_BIT; /* OC is used */ 2011ca56202SWolfgang Grandegger else 2021ca56202SWolfgang Grandegger v |= MXC_H1_OC_DIS_BIT; /* OC is not used */ 2031ca56202SWolfgang Grandegger __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC_OFFSET); 2041ca56202SWolfgang Grandegger 2051ca56202SWolfgang Grandegger break; 2061ca56202SWolfgang Grandegger case 2: /* Host 2 ULPI */ 2071ca56202SWolfgang Grandegger v = __raw_readl(usbother_base + MXC_USBH2CTRL_OFFSET); 208661052f4SBenoît Thébaudeau #ifdef CONFIG_MX51 2091ca56202SWolfgang Grandegger if (flags & MXC_EHCI_POWER_PINS_ENABLED) 210bdc52020SBenoît Thébaudeau v &= ~MXC_H2_UCTRL_H2PM_BIT; /* H2 power mask unused */ 2111ca56202SWolfgang Grandegger else 212bdc52020SBenoît Thébaudeau v |= MXC_H2_UCTRL_H2PM_BIT; /* H2 power mask used */ 213661052f4SBenoît Thébaudeau #endif 214*2cfe0b8fSBenoît Thébaudeau #ifdef CONFIG_MX53 215*2cfe0b8fSBenoît Thébaudeau if (flags & MXC_EHCI_POWER_PINS_ENABLED) 216*2cfe0b8fSBenoît Thébaudeau v &= ~MXC_H2_UCTRL_H2_OC_DIS_BIT; /* OC is used */ 217*2cfe0b8fSBenoît Thébaudeau else 218*2cfe0b8fSBenoît Thébaudeau v |= MXC_H2_UCTRL_H2_OC_DIS_BIT; /* OC is not used */ 219*2cfe0b8fSBenoît Thébaudeau #endif 2201ca56202SWolfgang Grandegger __raw_writel(v, usbother_base + MXC_USBH2CTRL_OFFSET); 2211ca56202SWolfgang Grandegger break; 222*2cfe0b8fSBenoît Thébaudeau #ifdef CONFIG_MX53 223*2cfe0b8fSBenoît Thébaudeau case 3: /* Host 3 ULPI */ 224*2cfe0b8fSBenoît Thébaudeau v = __raw_readl(usbother_base + MXC_USBH3CTRL_OFFSET); 225*2cfe0b8fSBenoît Thébaudeau if (flags & MXC_EHCI_POWER_PINS_ENABLED) 226*2cfe0b8fSBenoît Thébaudeau v &= ~MXC_H3_UCTRL_H3_OC_DIS_BIT; /* OC is used */ 227*2cfe0b8fSBenoît Thébaudeau else 228*2cfe0b8fSBenoît Thébaudeau v |= MXC_H3_UCTRL_H3_OC_DIS_BIT; /* OC is not used */ 229*2cfe0b8fSBenoît Thébaudeau __raw_writel(v, usbother_base + MXC_USBH3CTRL_OFFSET); 230*2cfe0b8fSBenoît Thébaudeau break; 231*2cfe0b8fSBenoît Thébaudeau #endif 2321ca56202SWolfgang Grandegger } 2331ca56202SWolfgang Grandegger 2341ca56202SWolfgang Grandegger return ret; 2351ca56202SWolfgang Grandegger } 2361ca56202SWolfgang Grandegger 2371b80f270SMarek Vasut void __board_ehci_hcd_postinit(struct usb_ehci *ehci, int port) 2381b80f270SMarek Vasut { 2391b80f270SMarek Vasut } 2401b80f270SMarek Vasut 2411b80f270SMarek Vasut void board_ehci_hcd_postinit(struct usb_ehci *ehci, int port) 2421b80f270SMarek Vasut __attribute((weak, alias("__board_ehci_hcd_postinit"))); 2431b80f270SMarek Vasut 244676ae068SLucas Stach int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) 2451ca56202SWolfgang Grandegger { 2461ca56202SWolfgang Grandegger struct usb_ehci *ehci; 2471ca56202SWolfgang Grandegger #ifdef CONFIG_MX53 2481ca56202SWolfgang Grandegger struct clkctl *sc_regs = (struct clkctl *)CCM_BASE_ADDR; 2491ca56202SWolfgang Grandegger u32 reg; 2501ca56202SWolfgang Grandegger 2511ca56202SWolfgang Grandegger reg = __raw_readl(&sc_regs->cscmr1) & ~(1 << 26); 2521ca56202SWolfgang Grandegger /* derive USB PHY clock multiplexer from PLL3 */ 2531ca56202SWolfgang Grandegger reg |= 1 << 26; 2541ca56202SWolfgang Grandegger __raw_writel(reg, &sc_regs->cscmr1); 2551ca56202SWolfgang Grandegger #endif 2561ca56202SWolfgang Grandegger 2571ca56202SWolfgang Grandegger set_usboh3_clk(); 2581ca56202SWolfgang Grandegger enable_usboh3_clk(1); 259414e1660SBenoît Thébaudeau set_usb_phy_clk(); 260414e1660SBenoît Thébaudeau enable_usb_phy1_clk(1); 2611ca56202SWolfgang Grandegger enable_usb_phy2_clk(1); 2621ca56202SWolfgang Grandegger mdelay(1); 2631ca56202SWolfgang Grandegger 2641b80f270SMarek Vasut /* Do board specific initialization */ 2651ca56202SWolfgang Grandegger board_ehci_hcd_init(CONFIG_MXC_USB_PORT); 2661ca56202SWolfgang Grandegger 2671ca56202SWolfgang Grandegger ehci = (struct usb_ehci *)(OTG_BASE_ADDR + 2681ca56202SWolfgang Grandegger (0x200 * CONFIG_MXC_USB_PORT)); 269676ae068SLucas Stach *hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength); 270676ae068SLucas Stach *hcor = (struct ehci_hcor *)((uint32_t)*hccr + 271676ae068SLucas Stach HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase))); 2721ca56202SWolfgang Grandegger setbits_le32(&ehci->usbmode, CM_HOST); 2731ca56202SWolfgang Grandegger 2741ca56202SWolfgang Grandegger __raw_writel(CONFIG_MXC_USB_PORTSC, &ehci->portsc); 2751ca56202SWolfgang Grandegger setbits_le32(&ehci->portsc, USB_EN); 2761ca56202SWolfgang Grandegger 2771ca56202SWolfgang Grandegger mxc_set_usbcontrol(CONFIG_MXC_USB_PORT, CONFIG_MXC_USB_FLAGS); 2781ca56202SWolfgang Grandegger mdelay(10); 2791ca56202SWolfgang Grandegger 2801b80f270SMarek Vasut /* Do board specific post-initialization */ 2811b80f270SMarek Vasut board_ehci_hcd_postinit(ehci, CONFIG_MXC_USB_PORT); 2821b80f270SMarek Vasut 2831ca56202SWolfgang Grandegger return 0; 2841ca56202SWolfgang Grandegger } 2851ca56202SWolfgang Grandegger 286676ae068SLucas Stach int ehci_hcd_stop(int index) 2871ca56202SWolfgang Grandegger { 2881ca56202SWolfgang Grandegger return 0; 2891ca56202SWolfgang Grandegger } 290