* [U-Boot] [PATCH] usb: adjust Efika USB code to generic ULPI framework
@ 2011-11-05 20:59 Jana Rapava
2011-11-05 21:37 ` Marek Vasut
0 siblings, 1 reply; 2+ messages in thread
From: Jana Rapava @ 2011-11-05 20:59 UTC (permalink / raw)
To: u-boot
This patch changes Efika USB support code to use generic ULPI implementation
instead of driver's own.
Signed-off-by: Jana Rapava <fermata7@gmail.com>
Cc: Marek Vasut <marek.vasut@gmail.com>
Cc: Remy Bohmer <linux@bohmer.net>
Cc: Stefano Babic <sbabic@denx.de>
Cc: Igor Grinberg <grinberg@compulab.co.il>
---
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 */
/*
--
1.7.6.3
^ permalink raw reply related [flat|nested] 2+ messages in thread* [U-Boot] [PATCH] usb: adjust Efika USB code to generic ULPI framework
2011-11-05 20:59 [U-Boot] [PATCH] usb: adjust Efika USB code to generic ULPI framework Jana Rapava
@ 2011-11-05 21:37 ` Marek Vasut
0 siblings, 0 replies; 2+ messages in thread
From: Marek Vasut @ 2011-11-05 21:37 UTC (permalink / raw)
To: u-boot
> 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 <fermata7@gmail.com>
> Cc: Marek Vasut <marek.vasut@gmail.com>
> Cc: Remy Bohmer <linux@bohmer.net>
> Cc: Stefano Babic <sbabic@denx.de>
> Cc: Igor Grinberg <grinberg@compulab.co.il>
> ---
> 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 */
>
> /*
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-11-05 21:37 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-05 20:59 [U-Boot] [PATCH] usb: adjust Efika USB code to generic ULPI framework Jana Rapava
2011-11-05 21:37 ` Marek Vasut
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox