static void otg_reset(struct msm_otg *dev, int phy_reset) { unsigned long timeout; u32 mode; clk_enable(dev->hs_clk); if (!phy_reset) goto reset_link; if (dev->pdata->phy_reset) dev->pdata->phy_reset(dev->regs); else msm_otg_phy_reset(dev); /*disable all phy interrupts*/ ulpi_write(dev, 0xFF, 0x0F); ulpi_write(dev, 0xFF, 0x12); msleep(100); reset_link: writel(USBCMD_RESET, USB_USBCMD); timeout = jiffies + USB_LINK_RESET_TIMEOUT; do { if (time_after(jiffies, timeout)) { pr_err("msm_otg: usb link reset timeout\n"); break; } msleep(1); } while (readl(USB_USBCMD) & USBCMD_RESET); /* select ULPI phy */ writel(0x80000000, USB_PORTSC); set_pre_emphasis_level(dev); set_cdr_auto_reset(dev); set_driver_amplitude(dev); writel(0x0, USB_AHB_BURST); writel(0x00, USB_AHB_MODE); clk_disable(dev->hs_clk); if (test_bit(ID, &dev->inputs)) mode = USBMODE_SDIS | USBMODE_DEVICE; else mode = USBMODE_SDIS | USBMODE_HOST; writel(mode, USB_USBMODE); if (dev->otg.gadget) enable_sess_valid(dev); #ifdef CONFIG_USB_EHCI_MSM if (dev->otg.host) enable_idgnd(dev); #endif }
static int msm_otg_reset(struct otg_transceiver *otg) { struct msm_otg *motg = container_of(otg, struct msm_otg, otg); struct msm_otg_platform_data *pdata = motg->pdata; int cnt = 0; int ret; u32 val = 0; u32 ulpi_val = 0; ret = msm_otg_phy_reset(motg); if (ret) { dev_err(otg->dev, "phy_reset failed\n"); return ret; } ulpi_init(motg); writel(USBCMD_RESET, USB_USBCMD); while (cnt < LINK_RESET_TIMEOUT_USEC) { if (!(readl(USB_USBCMD) & USBCMD_RESET)) break; udelay(1); cnt++; } if (cnt >= LINK_RESET_TIMEOUT_USEC) return -ETIMEDOUT; /* select ULPI phy */ writel(0x80000000, USB_PORTSC); msleep(100); writel(0x0, USB_AHBBURST); writel(0x00, USB_AHBMODE); if (pdata->otg_control == OTG_PHY_CONTROL) { val = readl(USB_OTGSC); if (pdata->mode == USB_OTG) { ulpi_val = ULPI_INT_IDGRD | ULPI_INT_SESS_VALID; val |= OTGSC_IDIE | OTGSC_BSVIE; } else if (pdata->mode == USB_PERIPHERAL) { ulpi_val = ULPI_INT_SESS_VALID; val |= OTGSC_BSVIE; } writel(val, USB_OTGSC); ulpi_write(otg, ulpi_val, ULPI_USB_INT_EN_RISE); ulpi_write(otg, ulpi_val, ULPI_USB_INT_EN_FALL); } return 0; }