usb: adjust Efika USB code to generic ULPI framework
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.
Signed-off-by Jana Rapava <[email protected]>
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
@@ -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
@@ -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
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
Signed-off-by Jana Rapava <[email protected]>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@@ -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@@ -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 */ /*