Skip to contentSkip to conversation

usb: adjust Efika USB code to generic ULPI framework

PATCH New Jana Rapava 2 participants 2 messages Nov 5, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 usb: adjust Efika USB code to generic ULPI framework

This patch changes Efika USB support code to use generic ULPI implementation instead of driver's own.

Cc Marek Vasut <[email protected]>
Cc Remy Bohmer <[email protected]>
Cc Stefano Babic <[email protected]>
Cc Igor Grinberg <[email protected]>
---
 board/efikamx/efikamx-usb.c |  105 +++++--------------------------------------
 include/configs/efikamx.h   |    1 +
 2 files changed, 13 insertions(+), 93 deletions(-)
board/efikamx/efikamx-usb.c +12 -93
index 3b42256..2a0341f 100644
@@ -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)
include/configs/efikamx.h +1 -0
index 537a1e4..988236b 100644
@@ -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 */
 
 /*
Signature · 1 line
1.7.6.3
#1 lore raw

PATCH 1/1 usb: adjust Efika USB code to generic ULPI framework

Quoted 2 lines

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.

Quoted 159 lines
Cc Marek Vasut <[email protected]>
Cc Remy Bohmer <[email protected]>
Cc Stefano Babic <[email protected]>
Cc Igor Grinberg <[email protected]>
---
 board/efikamx/efikamx-usb.c |  105
+++++-------------------------------------- include/configs/efikamx.h   | 
  1 +
 2 files changed, 13 insertions(+), 93 deletions(-)
board/efikamx/efikamx-usb.c +12 -93
index 3b42256..2a0341f 100644
@@ -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)
include/configs/efikamx.h +1 -0
index 537a1e4..988236b 100644
@@ -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 */
 
 /*