diff mbox

[2/2] OMAP4430: USB Host: Implement workaround for Errata i687

Message ID 1340961065-26938-2-git-send-email-ruslan.bilovol@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ruslan Bilovol June 29, 2012, 9:11 a.m. UTC
The OMAP4 EHCI controller has the following defect (errata ID i687):

Title:
	USB TLL Hold Timing Violation

Description:
	There is a timing hold violation on an internal logic on
	the clock USB TLL path resulting in a systematic connection
	failure on the TLL link

WORKAROUND:
	As part of workaround, next should be done:
	Set the I/O drive strength to 1.
	Depending which USB host subsystem is used,
	• Port B1 used: Set CONTROL.CONTROL_SMART2IO_PADCONF_2[11] USBB1_DR0_DS = 0x1
	• Port B2 used: Set CONTROL.CONTROL_SMART2IO_PADCONF_2[12] USBB2_DR0_DS = 0x1

All OMAP4430 devices are impacted.

Signed-off-by: Ruslan Bilovol <ruslan.bilovol@ti.com>
---
 arch/arm/mach-omap2/usb-host.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

Comments

Sergei Shtylyov June 30, 2012, 9:36 p.m. UTC | #1
Hello.

On 29-06-2012 13:11, Ruslan Bilovol wrote:

> The OMAP4 EHCI controller has the following defect (errata ID i687):

> Title:
> 	USB TLL Hold Timing Violation

> Description:
> 	There is a timing hold violation on an internal logic on
> 	the clock USB TLL path resulting in a systematic connection
> 	failure on the TLL link

> WORKAROUND:
> 	As part of workaround, next should be done:
> 	Set the I/O drive strength to 1.
> 	Depending which USB host subsystem is used,
> 	• Port B1 used: Set CONTROL.CONTROL_SMART2IO_PADCONF_2[11] USBB1_DR0_DS = 0x1
> 	• Port B2 used: Set CONTROL.CONTROL_SMART2IO_PADCONF_2[12] USBB2_DR0_DS = 0x1

> All OMAP4430 devices are impacted.

> Signed-off-by: Ruslan Bilovol<ruslan.bilovol@ti.com>
> ---
>   arch/arm/mach-omap2/usb-host.c |   17 +++++++++++++++++
>   1 files changed, 17 insertions(+), 0 deletions(-)

> diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c
> index dde8a11..3a6f2a2 100644
> --- a/arch/arm/mach-omap2/usb-host.c
> +++ b/arch/arm/mach-omap2/usb-host.c
[...]
> @@ -252,6 +253,14 @@ void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
>   			OMAP_PIN_INPUT_PULLDOWN);
>   		omap_mux_init_signal("usbb1_ulpitll_dat7",
>   			OMAP_PIN_INPUT_PULLDOWN);
> +
> +		/* Errata i687: set I/O drive strength to 1 */
> +		if (cpu_is_omap443x()) {
> +			u32 val;

    Empty line after the declaration block wouldn't hurt...

> +			val = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
> +			val |= OMAP4_USBB1_DR0_DS_MASK;
> +			omap4_ctrl_pad_writel(val, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
> +		}
>   			break;
>   	case OMAP_USBHS_PORT_MODE_UNUSED:
>   	default:
> @@ -309,6 +318,14 @@ void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
>   			OMAP_PIN_INPUT_PULLDOWN);
>   		omap_mux_init_signal("usbb2_ulpitll_dat7",
>   			OMAP_PIN_INPUT_PULLDOWN);
> +
> +		/* Errata i687: set I/O drive strength to 1 */
> +		if (cpu_is_omap443x()) {
> +			u32 val;

    Same here...

> +			val = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
> +			val |= OMAP4_USBB2_DR0_DS_MASK;
> +			omap4_ctrl_pad_writel(val, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
> +		}
>   			break;
>   	case OMAP_USBHS_PORT_MODE_UNUSED:
>   	default:

WBR, Sergei
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c
index dde8a11..3a6f2a2 100644
--- a/arch/arm/mach-omap2/usb-host.c
+++ b/arch/arm/mach-omap2/usb-host.c
@@ -30,6 +30,7 @@ 
 #include <plat/usb.h>
 #include <plat/omap_device.h>
 
+#include "control.h"
 #include "mux.h"
 
 #ifdef CONFIG_MFD_OMAP_USB_HOST
@@ -252,6 +253,14 @@  void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
 			OMAP_PIN_INPUT_PULLDOWN);
 		omap_mux_init_signal("usbb1_ulpitll_dat7",
 			OMAP_PIN_INPUT_PULLDOWN);
+
+		/* Errata i687: set I/O drive strength to 1 */
+		if (cpu_is_omap443x()) {
+			u32 val;
+			val = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
+			val |= OMAP4_USBB1_DR0_DS_MASK;
+			omap4_ctrl_pad_writel(val, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
+		}
 			break;
 	case OMAP_USBHS_PORT_MODE_UNUSED:
 	default:
@@ -309,6 +318,14 @@  void __init setup_4430ehci_io_mux(const enum usbhs_omap_port_mode *port_mode)
 			OMAP_PIN_INPUT_PULLDOWN);
 		omap_mux_init_signal("usbb2_ulpitll_dat7",
 			OMAP_PIN_INPUT_PULLDOWN);
+
+		/* Errata i687: set I/O drive strength to 1 */
+		if (cpu_is_omap443x()) {
+			u32 val;
+			val = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
+			val |= OMAP4_USBB2_DR0_DS_MASK;
+			omap4_ctrl_pad_writel(val, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_SMART2IO_PADCONF_2);
+		}
 			break;
 	case OMAP_USBHS_PORT_MODE_UNUSED:
 	default: