void imxusb_ulpi_write(struct imxehci_softc *sc, int addr, uint8_t data) { uint32_t reg; ulpi_wakeup(sc, TIMEOUT); reg = ULPI_RUN | ULPI_RW | __SHIFTIN(addr, ULPI_ADDR) | __SHIFTIN(data, ULPI_DATWR); bus_space_write_4(sc->sc_iot, sc->sc_ioh, IMXUSB_ULPIVIEW, reg); ulpi_wait(sc, TIMEOUT); return; }
uint8_t imxusb_ulpi_read(struct imxehci_softc *sc, int addr) { uint32_t data; ulpi_wakeup(sc, TIMEOUT); data = ULPI_RUN | __SHIFTIN(addr, ULPI_ADDR); bus_space_write_4(sc->sc_iot, sc->sc_ioh, IMXUSB_ULPIVIEW, data); data = ulpi_wait(sc, TIMEOUT); return __SHIFTOUT(data, ULPI_DATRD); }
/* * Wake the ULPI PHY up for communication * * returns 0 on success. */ static int ulpi_wakeup(struct ulpi_viewport *ulpi_vp) { int err; if (readl(ulpi_vp->viewport_addr) & ULPI_SS) return 0; /* already awake */ writel(ULPI_WU, ulpi_vp->viewport_addr); err = ulpi_wait(ulpi_vp, ULPI_WU); if (err) printf("ULPI wakeup timed out\n"); return err; }
/* * Wake the ULPI PHY up for communication * * returns 0 on success. */ static int ulpi_wakeup(struct ulpi_viewport *ulpi_vp) { int err; if (readl(ulpi_vp->viewport_addr) & OMAP_ULPI_ACCESS) return 0; /* already awake */ writel(OMAP_ULPI_ACCESS, ulpi_vp->viewport_addr); err = ulpi_wait(ulpi_vp, OMAP_ULPI_ACCESS); if (err) debug("ULPI wakeup timed out\n"); return err; }
/* * Issue a ULPI read/write request * * @value - the ULPI request */ static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value) { int err; err = ulpi_wakeup(ulpi_vp); if (err) return err; writel(value, ulpi_vp->viewport_addr); err = ulpi_wait(ulpi_vp, ULPI_RWRUN); if (err) printf("ULPI request timed out\n"); return err; }
/* * Issue a ULPI read/write request */ static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value) { int err; err = ulpi_wakeup(ulpi_vp); if (err) return err; writel(value, ulpi_vp->viewport_addr); err = ulpi_wait(ulpi_vp, OMAP_ULPI_ACCESS); if (err) debug("ULPI request timed out\n"); return err; }
static int ulpi_scratch_test(struct imxehci_softc *sc) { uint32_t ulpi_view; ulpi_view = ulpi_wakeup(sc, 1000); if (ulpi_view & ULPI_WU) { return -1; } bus_space_write_4(sc->sc_iot, sc->sc_ioh, IMXUSB_ULPIVIEW, (ULPI_RUN | ULPI_RW | (ULPI_SCRATCH << ULPI_ADDR_SHIFT) | 0xAA)); ulpi_view = ulpi_wait(sc, 1000); if (ulpi_view & ULPI_RUN) { return -1; } return 0; }