[PATCH 2/3][v2] drivers: usb :fsl: Implement Workaround for USB Erratum A007792
USB controller version-2.5 requires to enable internal UTMI phy and program PTS field in PORTSC register before asserting controller reset. This is must for successful resetting of the controller and subsequent enumeration of usb devices Signed-off-by: Nikhil Badola Signed-off-by: Suresh Gupta --- Changes for v2 : None drivers/usb/host/ehci-fsl.c | 9 + drivers/usb/host/fsl-mph-dr-of.c | 6 ++ include/linux/fsl_devices.h | 1 + 3 files changed, 16 insertions(+) diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 5352e74..716aa8b 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -129,6 +129,15 @@ static int fsl_ehci_drv_probe(struct platform_device *pdev) if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4); + /* +* Enable UTMI phy and program PTS field in UTMI mode before asserting +* controller reset for USB Controller version 2.5 +*/ + if (pdata->has_fsl_erratum_a007792) { + writel_be(CTRL_UTMI_PHY_EN, hcd->regs + FSL_SOC_USB_CTRL); + writel(PORT_PTS_UTMI, hcd->regs + FSL_SOC_USB_PORTSC1); + } + /* Don't need to set host mode here. It will be done by tdi_reset() */ retval = usb_add_hcd(hcd, irq, IRQF_SHARED); diff --git a/drivers/usb/host/fsl-mph-dr-of.c b/drivers/usb/host/fsl-mph-dr-of.c index 2195956..17e1e6b 100644 --- a/drivers/usb/host/fsl-mph-dr-of.c +++ b/drivers/usb/host/fsl-mph-dr-of.c @@ -214,6 +214,12 @@ static int fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) pdata->phy_mode = determine_usb_phy(prop); pdata->controller_ver = usb_get_ver_info(np); + /* Activate Erratum by reading property in device tree */ + if (of_get_property(np, "fsl,usb-erratum-a007792", NULL)) + pdata->has_fsl_erratum_a007792 = 1; + else + pdata->has_fsl_erratum_a007792 = 0; + if (pdata->have_sysif_regs) { if (pdata->controller_ver == FSL_USB_VER_NONE) { dev_warn(>dev, "Could not get controller version\n"); diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 0d4855cd..bdb40f6 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h @@ -97,6 +97,7 @@ struct fsl_usb2_platform_data { unsignedsuspended:1; unsignedalready_suspended:1; + unsignedhas_fsl_erratum_a007792:1; /* register save area for suspend/resume */ u32 pm_command; -- 1.7.11.7 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/3][v2] drivers: usb :fsl: Implement Workaround for USB Erratum A007792
USB controller version-2.5 requires to enable internal UTMI phy and program PTS field in PORTSC register before asserting controller reset. This is must for successful resetting of the controller and subsequent enumeration of usb devices Signed-off-by: Nikhil Badola nikhil.bad...@freescale.com Signed-off-by: Suresh Gupta suresh.gu...@freescale.com --- Changes for v2 : None drivers/usb/host/ehci-fsl.c | 9 + drivers/usb/host/fsl-mph-dr-of.c | 6 ++ include/linux/fsl_devices.h | 1 + 3 files changed, 16 insertions(+) diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index 5352e74..716aa8b 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -129,6 +129,15 @@ static int fsl_ehci_drv_probe(struct platform_device *pdev) if (pdata-have_sysif_regs pdata-controller_ver FSL_USB_VER_1_6) setbits32(hcd-regs + FSL_SOC_USB_CTRL, 0x4); + /* +* Enable UTMI phy and program PTS field in UTMI mode before asserting +* controller reset for USB Controller version 2.5 +*/ + if (pdata-has_fsl_erratum_a007792) { + writel_be(CTRL_UTMI_PHY_EN, hcd-regs + FSL_SOC_USB_CTRL); + writel(PORT_PTS_UTMI, hcd-regs + FSL_SOC_USB_PORTSC1); + } + /* Don't need to set host mode here. It will be done by tdi_reset() */ retval = usb_add_hcd(hcd, irq, IRQF_SHARED); diff --git a/drivers/usb/host/fsl-mph-dr-of.c b/drivers/usb/host/fsl-mph-dr-of.c index 2195956..17e1e6b 100644 --- a/drivers/usb/host/fsl-mph-dr-of.c +++ b/drivers/usb/host/fsl-mph-dr-of.c @@ -214,6 +214,12 @@ static int fsl_usb2_mph_dr_of_probe(struct platform_device *ofdev) pdata-phy_mode = determine_usb_phy(prop); pdata-controller_ver = usb_get_ver_info(np); + /* Activate Erratum by reading property in device tree */ + if (of_get_property(np, fsl,usb-erratum-a007792, NULL)) + pdata-has_fsl_erratum_a007792 = 1; + else + pdata-has_fsl_erratum_a007792 = 0; + if (pdata-have_sysif_regs) { if (pdata-controller_ver == FSL_USB_VER_NONE) { dev_warn(ofdev-dev, Could not get controller version\n); diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index 0d4855cd..bdb40f6 100644 --- a/include/linux/fsl_devices.h +++ b/include/linux/fsl_devices.h @@ -97,6 +97,7 @@ struct fsl_usb2_platform_data { unsignedsuspended:1; unsignedalready_suspended:1; + unsignedhas_fsl_erratum_a007792:1; /* register save area for suspend/resume */ u32 pm_command; -- 1.7.11.7 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/