static int msm_ulpi_write(struct msm_hcd *mhcd, u32 val, u32 reg) { struct usb_hcd *hcd = mhcd_to_hcd(mhcd); unsigned long timeout; /* initiate write operation */ writel_relaxed(ULPI_RUN | ULPI_WRITE | ULPI_ADDR(reg) | ULPI_DATA(val), USB_ULPI_VIEWPORT); /* wait for completion */ timeout = jiffies + usecs_to_jiffies(ULPI_IO_TIMEOUT_USECS); while (readl_relaxed(USB_ULPI_VIEWPORT) & ULPI_RUN) { if (time_after(jiffies, timeout)) { dev_err(mhcd->dev, "msm_ulpi_write: timeout\n"); dev_err(mhcd->dev, "PORTSC: %08x USBCMD: %08x\n", readl_relaxed(USB_PORTSC), readl_relaxed(USB_USBCMD)); return -ETIMEDOUT; } udelay(1); } return 0; }
static int ulpi_write(struct msm_hsic_hcd *mehci, u32 val, u32 reg) { struct usb_hcd *hcd = hsic_to_hcd(mehci); int cnt = 0; /* initiate write operation */ writel_relaxed(ULPI_RUN | ULPI_WRITE | ULPI_ADDR(reg) | ULPI_DATA(val), USB_ULPI_VIEWPORT); /* wait for completion */ while (cnt < ULPI_IO_TIMEOUT_USEC) { if (!(readl_relaxed(USB_ULPI_VIEWPORT) & ULPI_RUN)) break; udelay(1); cnt++; } if (cnt >= ULPI_IO_TIMEOUT_USEC) { dev_err(mehci->dev, "ulpi_write: timeout ULPI_VIEWPORT: %08x\n", readl_relaxed(USB_ULPI_VIEWPORT)); dev_err(mehci->dev, "PORTSC: %08x USBCMD: %08x FRINDEX: %08x\n", readl_relaxed(USB_PORTSC), readl_relaxed(USB_USBCMD), readl_relaxed(USB_FRINDEX)); /*frame counter increments afte 125us*/ udelay(130); dev_err(mehci->dev, "ulpi_write: FRINDEX: %08x\n", readl_relaxed(USB_FRINDEX)); return -ETIMEDOUT; } return 0; }
static void ulpi_write(struct usb_info *ui, unsigned val, unsigned reg) { unsigned timeout = 10000; /* initiate write operation */ writel(ULPI_RUN | ULPI_WRITE | ULPI_ADDR(reg) | ULPI_DATA(val), USB_ULPI_VIEWPORT); /* wait for completion */ while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout)) ; if (timeout == 0) ERROR("ulpi_write: timeout\n"); }
static void ulpi_write(struct usb_hcd *hcd, unsigned val, unsigned reg) { unsigned timeout = 10000; /* initiate write operation */ writel(ULPI_RUN | ULPI_WRITE | ULPI_ADDR(reg) | ULPI_DATA(val), USB_ULPI_VIEWPORT); /* wait for completion */ while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout)) ; if (timeout == 0) printk(KERN_WARNING "%s: timeout: reg: 0x%X, var: 0x%X\n", __func__, reg, val); }
static unsigned ulpi_read(struct usb_info *ui, unsigned reg) { unsigned timeout = 100000; /* initiate read operation */ writel(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg), USB_ULPI_VIEWPORT); /* wait for completion */ while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout)) ; if (timeout == 0) { ERROR("ulpi_read: timeout %08x\n", readl(USB_ULPI_VIEWPORT)); return 0xffffffff; } return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT)); }
static unsigned ulpi_read(void __iomem *usb_base, unsigned reg) { unsigned timeout = 100000; /* initiate read operation */ writel(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg), USB_ULPI_VIEWPORT); /* wait for completion */ while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout)) cpu_relax(); if (timeout == 0) { printk(KERN_ERR "ulpi_read: timeout %08x\n", readl(USB_ULPI_VIEWPORT)); return 0xffffffff; } return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT)); }
static int ulpi_write(void __iomem *usb_base, unsigned val, unsigned reg) { unsigned timeout = 10000; /* initiate write operation */ writel(ULPI_RUN | ULPI_WRITE | ULPI_ADDR(reg) | ULPI_DATA(val), USB_ULPI_VIEWPORT); /* wait for completion */ while ((readl(USB_ULPI_VIEWPORT) & ULPI_RUN) && (--timeout)) cpu_relax(); if (timeout == 0) { printk(KERN_ERR "ulpi_write: timeout\n"); return -1; } return 0; }
static int msm_ulpi_read(struct msm_hcd *mhcd, u32 reg) { struct usb_hcd *hcd = mhcd_to_hcd(mhcd); unsigned long timeout; /* initiate read operation */ writel_relaxed(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg), USB_ULPI_VIEWPORT); /* wait for completion */ timeout = jiffies + usecs_to_jiffies(ULPI_IO_TIMEOUT_USECS); while (readl_relaxed(USB_ULPI_VIEWPORT) & ULPI_RUN) { if (time_after(jiffies, timeout)) { dev_err(mhcd->dev, "msm_ulpi_read: timeout %08x\n", readl_relaxed(USB_ULPI_VIEWPORT)); return -ETIMEDOUT; } udelay(1); } return ULPI_DATA_READ(readl_relaxed(USB_ULPI_VIEWPORT)); }
static int ulpi_write(struct usb_phy *phy, u32 val, u32 reg) { struct msm_otg *motg = container_of(phy, struct msm_otg, phy); int cnt = 0; /* initiate write operation */ writel(ULPI_RUN | ULPI_WRITE | ULPI_ADDR(reg) | ULPI_DATA(val), USB_ULPI_VIEWPORT); /* wait for completion */ while (cnt < ULPI_IO_TIMEOUT_USEC) { if (!(readl(USB_ULPI_VIEWPORT) & ULPI_RUN)) break; udelay(1); cnt++; } if (cnt >= ULPI_IO_TIMEOUT_USEC) { dev_err(phy->dev, "ulpi_write: timeout\n"); return -ETIMEDOUT; } return 0; }
static int ulpi_read(struct usb_phy *phy, u32 reg) { struct msm_otg *motg = container_of(phy, struct msm_otg, phy); int cnt = 0; /* initiate read operation */ writel(ULPI_RUN | ULPI_READ | ULPI_ADDR(reg), USB_ULPI_VIEWPORT); /* wait for completion */ while (cnt < ULPI_IO_TIMEOUT_USEC) { if (!(readl(USB_ULPI_VIEWPORT) & ULPI_RUN)) break; udelay(1); cnt++; } if (cnt >= ULPI_IO_TIMEOUT_USEC) { dev_err(phy->dev, "ulpi_read: timeout %08x\n", readl(USB_ULPI_VIEWPORT)); return -ETIMEDOUT; } return ULPI_DATA_READ(readl(USB_ULPI_VIEWPORT)); }
// ulpi phy power on static void ulpi_phy_power_on(void) { uint32_t val; uint32_t base = USBADDR2; udelay(1000); usb_reset(base); val = readl(base + ULPI_TIMING_CTRL_0); val |= ULPI_OUTPUT_PINMUX_BYP | ULPI_CLKOUT_PINMUX_BYP; writel(val, base + ULPI_TIMING_CTRL_0); val = readl(base + USB_SUSP_CTRL); val |= ULPI_PHY_ENABLE; writel(val, base + USB_SUSP_CTRL); val = 0; writel(val, base + ULPI_TIMING_CTRL_1); val |= ULPI_DATA_TRIMMER_SEL(4); val |= ULPI_STPDIRNXT_TRIMMER_SEL(4); val |= ULPI_DIR_TRIMMER_SEL(4); writel(val, base + ULPI_TIMING_CTRL_1); udelay(10); val |= ULPI_DATA_TRIMMER_LOAD; val |= ULPI_STPDIRNXT_TRIMMER_LOAD; val |= ULPI_DIR_TRIMMER_LOAD; writel(val, base + ULPI_TIMING_CTRL_1); val = ULPI_WAKEUP | ULPI_RD_RW_WRITE | ULPI_PORT(0); writel(val, base + ULPI_VIEWPORT); if (wait_for_register(base + ULPI_VIEWPORT, ULPI_WAKEUP, 0, 1000)) { printf("%s: timeout waiting for ulpi phy wakeup\n", __func__); return; } /* Fix VbusInvalid due to floating VBUS */ val = ULPI_RUN | ULPI_RD_RW_WRITE | ULPI_PORT(0) | ULPI_ADDR(0x08) | ULPI_DATA_WR(0x40); writel(val, base + ULPI_VIEWPORT); if (wait_for_register(base + ULPI_VIEWPORT, ULPI_RUN, 0, 1000)) { printf("%s: timeout accessing ulpi phy\n", __func__); return; } val = ULPI_RUN | ULPI_RD_RW_WRITE | ULPI_PORT(0) | ULPI_ADDR(0x0B) | ULPI_DATA_WR(0x80); writel(val, base + ULPI_VIEWPORT); if (wait_for_register(base + ULPI_VIEWPORT, ULPI_RUN, 0, 1000)) { printf("%s: timeout accessing ulpi phy\n", __func__); return; } val = readl(base + USB_PORTSC1); val |= USB_PORTSC1_WKOC | USB_PORTSC1_WKDS | USB_PORTSC1_WKCN; writel(val, base + USB_PORTSC1); val = readl(base + USB_SUSP_CTRL); val |= USB_SUSP_CLR; writel(val, base + USB_SUSP_CTRL); udelay(100); val = readl(base + USB_SUSP_CTRL); val &= ~USB_SUSP_CLR; writel(val, base + USB_SUSP_CTRL); }