소스 검색

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.badola@freescale.com>
Signed-off-by: Suresh Gupta <suresh.gupta@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Nikhil Badola 10 년 전
부모
커밋
523f1dec58
3개의 변경된 파일16개의 추가작업 그리고 0개의 파일을 삭제
  1. 9 0
      drivers/usb/host/ehci-fsl.c
  2. 6 0
      drivers/usb/host/fsl-mph-dr-of.c
  3. 1 0
      include/linux/fsl_devices.h

+ 9 - 0
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)
 	if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6)
 		setbits32(hcd->regs + FSL_SOC_USB_CTRL, 0x4);
 		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() */
 	/* Don't need to set host mode here. It will be done by tdi_reset() */
 
 
 	retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
 	retval = usb_add_hcd(hcd, irq, IRQF_SHARED);

+ 6 - 0
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->phy_mode = determine_usb_phy(prop);
 	pdata->controller_ver = usb_get_ver_info(np);
 	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->have_sysif_regs) {
 		if (pdata->controller_ver == FSL_USB_VER_NONE) {
 		if (pdata->controller_ver == FSL_USB_VER_NONE) {
 			dev_warn(&ofdev->dev, "Could not get controller version\n");
 			dev_warn(&ofdev->dev, "Could not get controller version\n");

+ 1 - 0
include/linux/fsl_devices.h

@@ -97,6 +97,7 @@ struct fsl_usb2_platform_data {
 
 
 	unsigned	suspended:1;
 	unsigned	suspended:1;
 	unsigned	already_suspended:1;
 	unsigned	already_suspended:1;
+	unsigned        has_fsl_erratum_a007792:1;
 
 
 	/* register save area for suspend/resume */
 	/* register save area for suspend/resume */
 	u32		pm_command;
 	u32		pm_command;