MLK-18316 imx8: Fix USBOTG disconnect when XRDC blocking is enabled
authorYe Li <ye.li@nxp.com>
Tue, 15 May 2018 09:03:19 +0000 (02:03 -0700)
committerYe Li <ye.li@nxp.com>
Thu, 29 Apr 2021 07:56:22 +0000 (00:56 -0700)
We clean USBOTG register USBCMD if it is used in serial download mode.
When XRDC blocking is enabled, we can't write this register directly,
must enable the OTG power, otherwise the kernel will get SError
exception in mfgtool.

Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit cf2143dc97b2a8f21b828c7386c59ee965d981f2)
(cherry picked from commit 55dd2c8e17eca27b3d393be9fd84a153ce7bf37b)
(cherry picked from commit 4cadac201b480ac28dcbb27903489a98c0303a3d)
(cherry picked from commit 60d41ce815e5bd63952794d2868ee7dd3be54157)

arch/arm/mach-imx/imx8/cpu.c

index 162c2bc..d3c6fd9 100644 (file)
@@ -839,3 +839,28 @@ bool m4_parts_booted(void)
 
        return false;
 }
+
+void disconnect_from_pc(void)
+{
+       int ret;
+       struct power_domain pd;
+
+       if (!power_domain_lookup_name("conn_usb0", &pd)) {
+               ret = power_domain_on(&pd);
+               if (ret) {
+                       printf("conn_usb0 Power up failed! (error = %d)\n", ret);
+                       return;
+               }
+
+               writel(0x0, USB_BASE_ADDR + 0x140);
+
+               ret = power_domain_off(&pd);
+               if (ret) {
+                       printf("conn_usb0 Power off failed! (error = %d)\n", ret);
+                       return;
+               }
+       } else {
+               printf("conn_usb0 finding failed!\n");
+               return;
+       }
+}