From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Sat, 5 Nov 2011 22:37:46 +0100 Subject: [U-Boot] [PATCH] usb: adjust Efika USB code to generic ULPI framework In-Reply-To: <1320526753-30544-1-git-send-email-fermata7@gmail.com> References: <1320526753-30544-1-git-send-email-fermata7@gmail.com> Message-ID: <201111052237.46426.marek.vasut@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de > This patch changes Efika USB support code to use generic ULPI > implementation instead of driver's own. The patchset for efika wasn't mainlined yet, please reintegrate and resubmit the whole thing. > > Signed-off-by: Jana Rapava > Cc: Marek Vasut > Cc: Remy Bohmer > Cc: Stefano Babic > Cc: Igor Grinberg > --- > board/efikamx/efikamx-usb.c | 105 > +++++-------------------------------------- include/configs/efikamx.h | > 1 + > 2 files changed, 13 insertions(+), 93 deletions(-) > > diff --git a/board/efikamx/efikamx-usb.c b/board/efikamx/efikamx-usb.c > index 3b42256..2a0341f 100644 > --- a/board/efikamx/efikamx-usb.c > +++ b/board/efikamx/efikamx-usb.c > @@ -205,104 +205,21 @@ void control_regs_setup(struct mx5_usb_control_regs > *control) udelay(10000); > } > > -#define ULPI_ADDR_SHIFT 16 > -#define ulpi_write_mask(value) ((value) & 0xff) > -#define ulpi_read_mask(value) (((value) >> 8) & 0xff) > - > -int ulpi_wait(struct usb_ehci *ehci, u32 ulpi_value, u32 ulpi_mask) > +void ulpi_set_flags(struct usb_ehci *ehci, struct ulpi_regs *ulpi) > { > - int timeout = ULPI_TIMEOUT; > - u32 tmp; > - > - writel(ulpi_value, &ehci->ulpi_viewpoint); > - > - /* Wait for the bits in ulpi_mask to become zero. */ > - while (--timeout) { > - tmp = readl(&ehci->ulpi_viewpoint); > - if (!(tmp & ulpi_mask)) > - break; > - WATCHDOG_RESET(); > - } > - > - return !timeout; > -} > - > -int ulpi_wakeup(struct usb_ehci *ehci) > -{ > - if (readl(&ehci->ulpi_viewpoint) & ULPI_SS) > - return 0; /* already awake */ > - return ulpi_wait(ehci, ULPI_WU, ULPI_WU); > -} > - > -void ulpi_write(struct usb_ehci *ehci, u32 reg, u32 value) > -{ > - u32 tmp; > - if (ulpi_wakeup(ehci)) { > - printf("ULPI wakeup timed out\n"); > - return; > - } > - > - tmp = ulpi_wait(ehci, ULPI_RWRUN | ULPI_RWCTRL | > - reg << ULPI_ADDR_SHIFT | ulpi_write_mask(value), ULPI_RWRUN); > - if (tmp) > - printf("ULPI write timed out\n"); > -} > - > -u32 ulpi_read(struct usb_ehci *ehci, u32 reg) > -{ > - if (ulpi_wakeup(ehci)) { > - printf("ULPI wakeup timed out\n"); > - return 0; > - } > - > - if (ulpi_wait(ehci, ULPI_RWRUN | reg << ULPI_ADDR_SHIFT, ULPI_RWRUN)) { > - printf("ULPI read timed out\n"); > - return 0; > - } > - > - return ulpi_read_mask(readl(&ehci->ulpi_viewpoint)); > -} > - > -void ulpi_init(struct usb_ehci *ehci, struct ulpi_regs *ulpi) > -{ > - u32 tmp = 0; > - int reg, i; > - > - /* Assemble ID from four ULPI ID registers (8 bits each). */ > - for (reg = ULPI_ID_REGS_COUNT - 1; reg >= 0; reg--) > - tmp |= ulpi_read(ehci, reg) << (reg * 8); > - > - /* Split ID into vendor and product ID. */ > - debug("Found ULPI TX, ID %04x:%04x\n", tmp >> 16, tmp & 0xffff); > - > - /* ULPI integrity check */ > - for (i = 0; i < 2; i++) { > - ulpi_write(ehci, (u32)&ulpi->scratch_write, > - ULPI_TEST_VALUE << i); > - tmp = ulpi_read(ehci, (u32)&ulpi->scratch_write); > - > - if (tmp != (ULPI_TEST_VALUE << i)) { > - printf("ULPI integrity check failed\n"); > - return; > - } > - } > - > - /* Set ULPI flags. */ > - ulpi_write(ehci, (u32)&ulpi->otg_ctrl_write, > - ULPI_OTG_EXTVBUSIND | > + ulpi_otg_ctrl_flags(ehci, ulpi, WRITE, ULPI_OTG_EXTVBUSIND | > ULPI_OTG_DM_PULLDOWN | ULPI_OTG_DP_PULLDOWN); > - ulpi_write(ehci, (u32)&ulpi->function_ctrl_write, > - ULPI_FC_XCVRSEL | ULPI_FC_OPMODE_NORMAL | > - ULPI_FC_SUSPENDM); > - ulpi_write(ehci, (u32)&ulpi->iface_ctrl_write, 0); > - ulpi_write(ehci, (u32)&ulpi->otg_ctrl_set, > - ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT); > + ulpi_function_ctrl_flags(ehci, ulpi, WRITE, ULPI_FC_XCVRSEL | > + ULPI_FC_OPMODE_NORMAL | ULPI_FC_SUSPENDM); > + ulpi_iface_ctrl_flags(ehci, ulpi, WRITE, 0); > > /* > - * NOTE: This violates USB specification, but otherwise, USB on Efika > - * doesn't charge VBUS and as a result, USB doesn't work. > + * NOTE: Setting ULPI_OTG_CHRGVBUS violates USB specification, > + * but otherwise, USB on Efika doesn't charge VBUS > + * and as a result, USB doesn't work. > */ > - ulpi_write(ehci, (u32)&ulpi->otg_ctrl_set, ULPI_OTG_CHRGVBUS); > + ulpi_otg_ctrl_flags(ehci, ulpi, SET, ULPI_OTG_DRVVBUS | > + ULPI_OTG_DRVVBUS_EXT | ULPI_OTG_CHRGVBUS); > } > > /* > @@ -353,6 +270,7 @@ void ehci1_init(struct usb_ehci *ehci, struct ulpi_regs > *ulpi) udelay(10000); > > ulpi_init(ehci, ulpi); > + ulpi_set_flags(ehci, ulpi); > } > > void ehci2_init(struct usb_ehci *ehci, struct ulpi_regs *ulpi) > @@ -372,6 +290,7 @@ void ehci2_init(struct usb_ehci *ehci, struct ulpi_regs > *ulpi) udelay(10000); > > ulpi_init(ehci, ulpi); > + ulpi_set_flags(ehci, ulpi); > } > > int ehci_hcd_init(void) > diff --git a/include/configs/efikamx.h b/include/configs/efikamx.h > index 537a1e4..988236b 100644 > --- a/include/configs/efikamx.h > +++ b/include/configs/efikamx.h > @@ -188,6 +188,7 @@ > #define CONFIG_EHCI_IS_TDI > #define CONFIG_USB_STORAGE > #define CONFIG_USB_KEYBOARD > +#define CONFIG_USB_ULPI > #endif /* CONFIG_CMD_USB */ > > /*