void __init mapphone_ehci_init(void) { if (!strcmp(boot_mode, "charger")) return; omap_cfg_reg(AF5_34XX_GPIO142); /* IPC_USB_SUSP */ omap_cfg_reg(AD1_3430_USB3FS_PHY_MM3_RXRCV); omap_cfg_reg(AD2_3430_USB3FS_PHY_MM3_TXDAT); omap_cfg_reg(AC1_3430_USB3FS_PHY_MM3_TXEN_N); omap_cfg_reg(AE1_3430_USB3FS_PHY_MM3_TXSE0); if (is_cdma_phone()) mapphone_init_modem_interface(); #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) if (!is_cdma_phone()) { usb_platform_data.port_data[2].mode = EHCI_HCD_OMAP_MODE_ULPI_TLL_SDR; platform_device_register(&ehci_device); } #endif #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) if (is_cdma_phone()) platform_device_register(&ohci_device); #endif }
void __init mapphone_ehci_init(void) { if (!strcmp(boot_mode, "charger")) return; omap_cfg_reg(AF5_34XX_GPIO142); /* IPC_USB_SUSP */ omap_cfg_reg(AD1_3430_USB3FS_PHY_MM3_RXRCV); omap_cfg_reg(AD2_3430_USB3FS_PHY_MM3_TXDAT); omap_cfg_reg(AC1_3430_USB3FS_PHY_MM3_TXEN_N); omap_cfg_reg(AE1_3430_USB3FS_PHY_MM3_TXSE0); #ifdef CONFIG_USB_SERIAL_VIATELECOM_CBP if (mapphone_bp_get_type() == MAPPHONE_BP_VIACBP71) { printk(KERN_INFO "VIA BP is chosen\n"); ohci_device.dev.platform_data = &dummy_usb_config_via; } #endif if (is_cdma_phone()) mapphone_init_modem_interface(); #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) if (!is_cdma_phone()) { usb_platform_data.port_data[2].mode = EHCI_HCD_OMAP_MODE_ULPI_TLL_SDR; platform_device_register(&ehci_device); } #endif #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) if (is_cdma_phone()) platform_device_register(&ohci_device); #endif }
static void __init sholest_ehci_init(void) { omap_cfg_reg(AF5_34XX_GPIO142); /* IPC_USB_SUSP */ omap_cfg_reg(AD1_3430_USB3FS_PHY_MM3_RXRCV); omap_cfg_reg(AD2_3430_USB3FS_PHY_MM3_TXDAT); omap_cfg_reg(AC1_3430_USB3FS_PHY_MM3_TXEN_N); omap_cfg_reg(AE1_3430_USB3FS_PHY_MM3_TXSE0); #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) platform_device_register(&ehci_device); #endif #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) if (is_cdma_phone()) platform_device_register(&ohci_device); #endif }
/* omap_start_ehc * - Start the TI USBHOST controller */ static int omap_start_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd) { unsigned long timeout = jiffies + msecs_to_jiffies(1000); unsigned reg = 0; int ret = 0; int reset_delay; int i; dev_dbg(&omap->dev->dev, "starting TI EHCI USB Controller\n"); /* Enable Clocks for USBHOST */ omap->usbhost_ick = clk_get(&omap->dev->dev, "usbhost_ick"); if (IS_ERR(omap->usbhost_ick)) { ret = PTR_ERR(omap->usbhost_ick); goto err_host_ick; } clk_enable(omap->usbhost_ick); omap->usbhost2_120m_fck = clk_get(&omap->dev->dev, "usbhost_120m_fck"); if (IS_ERR(omap->usbhost2_120m_fck)) { ret = PTR_ERR(omap->usbhost2_120m_fck); goto err_host_120m_fck; } clk_enable(omap->usbhost2_120m_fck); omap->usbhost1_48m_fck = clk_get(&omap->dev->dev, "usbhost_48m_fck"); if (IS_ERR(omap->usbhost1_48m_fck)) { ret = PTR_ERR(omap->usbhost1_48m_fck); goto err_host_48m_fck; } clk_enable(omap->usbhost1_48m_fck); reset_delay = 0; for (i = 0; i < OMAP_TLL_CHANNEL_COUNT; i++) { reset_delay = reset_delay > omap->port_data[i].reset_delay ? reset_delay : omap->port_data[i].reset_delay; if (omap->port_data[i].startup) { ret = omap->port_data[i].startup(omap->dev, i); if (ret < 0) return ret; } if (omap->port_data[i].reset) omap->port_data[i].reset(omap->dev, i, 0); } if (reset_delay) udelay(reset_delay); /* Configure TLL for 60Mhz clk for ULPI */ omap->usbtll_fck = clk_get(&omap->dev->dev, "usbtll_fck"); if (IS_ERR(omap->usbtll_fck)) { ret = PTR_ERR(omap->usbtll_fck); goto err_tll_fck; } clk_enable(omap->usbtll_fck); omap->usbtll_ick = clk_get(&omap->dev->dev, "usbtll_ick"); if (IS_ERR(omap->usbtll_ick)) { ret = PTR_ERR(omap->usbtll_ick); goto err_tll_ick; } clk_enable(omap->usbtll_ick); set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); #ifndef CONFIG_MAPPHONE_2NDBOOT /* perform TLL soft reset, and wait until reset is complete */ ehci_omap_writel(omap->tll_base, OMAP_USBTLL_SYSCONFIG, OMAP_USBTLL_SYSCONFIG_SOFTRESET); /* Wait for TLL reset to complete */ while (!(ehci_omap_readl(omap->tll_base, OMAP_USBTLL_SYSSTATUS) & OMAP_USBTLL_SYSSTATUS_RESETDONE)) { cpu_relax(); if (time_after(jiffies, timeout)) { dev_dbg(&omap->dev->dev, "operation timed out\n"); ret = -EINVAL; goto err_sys_status; } } #endif dev_dbg(&omap->dev->dev, "TLL RESET DONE\n"); /* SmartIdle mode */ ehci_omap_writel(omap->tll_base, OMAP_USBTLL_SYSCONFIG, OMAP_USBTLL_SYSCONFIG_ENAWAKEUP | OMAP_USBTLL_SYSCONFIG_SIDLEMODE | OMAP_USBTLL_SYSCONFIG_AUTOIDLE); /* Put UHH in NoIdle/NoStandby mode */ ehci_omap_writel(omap->uhh_base, OMAP_UHH_SYSCONFIG, OMAP_UHH_SYSCONFIG_ENAWAKEUP | OMAP_UHH_SYSCONFIG_NOIDLEMODE | OMAP_UHH_SYSCONFIG_NOSTBYMODE | OMAP_UHH_SYSCONFIG_AUTOIDLE); #ifdef CONFIG_MACH_MAPPHONE /* We need to suspend OHCI in order for the usbhost * domain to go standby. * OHCI would never be resumed for UMTS modem */ if (!is_cdma_phone()) omap_writel(OHCI_HC_CTRL_SUSPEND, OHCI_HC_CONTROL); #endif reg = ehci_omap_readl(omap->uhh_base, OMAP_UHH_HOSTCONFIG); /* setup ULPI bypass and burst configurations */ reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN | OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN | OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN); reg &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN; if (!(omap->port_data[0].flags & EHCI_HCD_OMAP_FLAG_ENABLED)) reg &= ~OMAP_UHH_HOSTCONFIG_P1_CONNECT_STATUS; if (!(omap->port_data[1].flags & EHCI_HCD_OMAP_FLAG_ENABLED)) reg &= ~OMAP_UHH_HOSTCONFIG_P2_CONNECT_STATUS; if (!(omap->port_data[2].flags & EHCI_HCD_OMAP_FLAG_ENABLED)) reg &= ~OMAP_UHH_HOSTCONFIG_P3_CONNECT_STATUS; /* Bypass the TLL module for PHY mode operation */ if (omap_rev() <= OMAP3430_REV_ES2_1) { dev_dbg(&omap->dev->dev, "OMAP3 ES version <= ES2.1 \n"); if (omap_usb_port_ulpi_bypass(omap->port_data[0].mode)) reg |= OMAP_UHH_HOSTCONFIG_ULPI_BYPASS; else reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_BYPASS; } else { dev_dbg(&omap->dev->dev, "OMAP3 ES version > ES2.1\n"); if (omap_usb_port_ulpi_bypass(omap->port_data[0].mode)) reg |= OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS; else reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS; if (omap_usb_port_ulpi_bypass(omap->port_data[1].mode)) reg |= OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS; else reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS; if (omap_usb_port_ulpi_bypass(omap->port_data[2].mode)) reg |= OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS; else reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS; } ehci_omap_writel(omap->uhh_base, OMAP_UHH_HOSTCONFIG, reg); dev_dbg(&omap->dev->dev, "UHH setup done, uhh_hostconfig=%x\n", reg); /* Enable UTMI mode for required TLL channels */ omap_usb_utmi_init(omap); reset_delay = 0; for (i = 0; i < OMAP3_HS_USB_PORTS; i++) { reset_delay = reset_delay > omap->port_data[i].reset_delay ? reset_delay : omap->port_data[i].reset_delay; } if (reset_delay) udelay(reset_delay); for (i = 0; i < OMAP3_HS_USB_PORTS; i++) { if (omap->port_data[i].reset) omap->port_data[i].reset(omap->dev, i, 1); } #if defined(CONFIG_MACH_MAPPHONE) /* Refer ISSUE2: LINK assumes external charge pump */ /* use Port1 VBUS to charge externally Port2: * So for PHY mode operation use Port2 only */ ehci_omap_writel(omap->ehci_base, EHCI_INSNREG05_ULPI, (0xA << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |/* OTG ctrl reg*/ (2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |/* Write */ (2 << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT) |/* Port1 */ (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT) |/* Start */ (0x26)); while (!(ehci_omap_readl(omap->ehci_base, EHCI_INSNREG05_ULPI) & (1<<EHCI_INSNREG05_ULPI_CONTROL_SHIFT))) { cpu_relax(); } #endif return 0; err_sys_status: clk_disable(omap->usbtll_ick); clk_put(omap->usbtll_ick); err_tll_ick: clk_disable(omap->usbtll_fck); clk_put(omap->usbtll_fck); err_tll_fck: clk_disable(omap->usbhost1_48m_fck); clk_put(omap->usbhost1_48m_fck); err_host_48m_fck: clk_disable(omap->usbhost2_120m_fck); clk_put(omap->usbhost2_120m_fck); err_host_120m_fck: clk_disable(omap->usbhost_ick); clk_put(omap->usbhost_ick); err_host_ick: return ret; }