MLK-17821-3 imx8qxp/qm: Add board codes to adapt CDNS3 USB gadget driver
authorYe Li <ye.li@nxp.com>
Mon, 19 Mar 2018 05:34:31 +0000 (22:34 -0700)
committerYe Li <ye.li@nxp.com>
Mon, 19 Mar 2018 08:53:24 +0000 (01:53 -0700)
All iMX8QM/iMX8QXP MEK ARM2 boards have typec port for CDNS3 USB. This patch
addes board level codes to init and clean up CDNS3 USB gadget driver.

Signed-off-by: Ye Li <ye.li@nxp.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
board/freescale/imx8qm_arm2/imx8qm_arm2.c
board/freescale/imx8qm_mek/imx8qm_mek.c
board/freescale/imx8qxp_arm2/imx8qxp_arm2.c
board/freescale/imx8qxp_mek/imx8qxp_mek.c

index c31e5d1..e3bbfd3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -28,6 +28,7 @@
 #include <asm/imx-common/video.h>
 #include <asm/arch/video_common.h>
 #include <power-domain.h>
+#include <cdns3-uboot.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -499,6 +500,82 @@ void pci_init_board(void)
 }
 #endif
 
+#ifdef CONFIG_USB_CDNS3_GADGET
+
+static struct cdns3_device cdns3_device_data = {
+       .none_core_base = 0x5B110000,
+       .xhci_base = 0x5B130000,
+       .dev_base = 0x5B140000,
+       .phy_base = 0x5B160000,
+       .otg_base = 0x5B120000,
+       .dr_mode = USB_DR_MODE_PERIPHERAL,
+       .index = 1,
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+       cdns3_uboot_handle_interrupt(1);
+       return 0;
+}
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+       int ret = 0;
+
+       if (index == 1) {
+               if (init == USB_INIT_DEVICE) {
+                       struct power_domain pd;
+                       int ret;
+
+                       /* Power on usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+
+                       ret = cdns3_uboot_init(&cdns3_device_data);
+                       printf("%d cdns3_uboot_initmode %d\n", index, ret);
+               }
+       }
+       return ret;
+}
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+       int ret = 0;
+
+       if (index == 1) {
+               if (init == USB_INIT_DEVICE) {
+                       struct power_domain pd;
+                       int ret;
+
+                       cdns3_uboot_exit(1);
+
+                       /* Power off usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+               }
+       }
+       return ret;
+}
+#endif
+
 int board_init(void)
 {
 #ifdef CONFIG_MXC_GPIO
@@ -591,30 +668,6 @@ int is_recovery_key_pressing(void)
 #endif /*CONFIG_ANDROID_RECOVERY*/
 #endif /*CONFIG_FSL_FASTBOOT*/
 
-/* Only Enable USB3 resources currently */
-int board_usb_init(int index, enum usb_init_type init)
-{
-#ifndef CONFIG_DM_USB
-       struct power_domain pd;
-       int ret;
-
-       /* Power on usb */
-       if (!power_domain_lookup_name("conn_usb2", &pd)) {
-               ret = power_domain_on(&pd);
-               if (ret)
-                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
-       }
-
-       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
-               ret = power_domain_on(&pd);
-               if (ret)
-                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
-       }
-#endif
-
-       return 0;
-}
-
 #if defined(CONFIG_VIDEO_IMXDPUV1)
 static void enable_lvds(struct display_info_t const *dev)
 {
index 4546dac..598df72 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -28,6 +28,7 @@
 #include <asm/arch/video_common.h>
 #include <power-domain.h>
 #include "../common/tcpc.h"
+#include <cdns3-uboot.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -314,13 +315,53 @@ static void setup_typec(void)
        tcpc_init(&port, port_config, &ss_mux_select);
 }
 
+static struct cdns3_device cdns3_device_data = {
+       .none_core_base = 0x5B110000,
+       .xhci_base = 0x5B130000,
+       .dev_base = 0x5B140000,
+       .phy_base = 0x5B160000,
+       .otg_base = 0x5B120000,
+       .dr_mode = USB_DR_MODE_PERIPHERAL,
+       .index = 1,
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+       cdns3_uboot_handle_interrupt(1);
+       return 0;
+}
+
 int board_usb_init(int index, enum usb_init_type init)
 {
        int ret = 0;
 
-       if (init == USB_INIT_HOST)
-               ret = tcpc_setup_dfp_mode(&port);
-
+       if (index == 1) {
+               if (init == USB_INIT_HOST) {
+                       ret = tcpc_setup_dfp_mode(&port);
+               } else {
+                       struct power_domain pd;
+                       int ret;
+
+                       /* Power on usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+
+                       ret = tcpc_setup_ufp_mode(&port);
+                       printf("%d setufp mode %d\n", index, ret);
+
+                       ret = cdns3_uboot_init(&cdns3_device_data);
+                       printf("%d cdns3_uboot_initmode %d\n", index, ret);
+               }
+       }
        return ret;
 }
 
@@ -328,9 +369,29 @@ int board_usb_cleanup(int index, enum usb_init_type init)
 {
        int ret = 0;
 
-       if (init == USB_INIT_HOST)
-               ret = tcpc_disable_src_vbus(&port);
-
+       if (index == 1) {
+               if (init == USB_INIT_HOST) {
+                       ret = tcpc_disable_src_vbus(&port);
+               } else {
+                       struct power_domain pd;
+                       int ret;
+
+                       cdns3_uboot_exit(1);
+
+                       /* Power off usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+               }
+       }
        return ret;
 }
 #endif
index 5eb61b0..d3a4e2f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -29,6 +29,7 @@
 #include <asm/imx-common/dma.h>
 #include <asm/arch/video_common.h>
 #include <power-domain.h>
+#include <cdns3-uboot.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -506,6 +507,82 @@ void pci_init_board(void)
 
 #endif
 
+#if defined(CONFIG_USB_CDNS3_GADGET)
+
+static struct cdns3_device cdns3_device_data = {
+       .none_core_base = 0x5B110000,
+       .xhci_base = 0x5B130000,
+       .dev_base = 0x5B140000,
+       .phy_base = 0x5B160000,
+       .otg_base = 0x5B120000,
+       .dr_mode = USB_DR_MODE_PERIPHERAL,
+       .index = 1,
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+       cdns3_uboot_handle_interrupt(1);
+       return 0;
+}
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+       int ret = 0;
+
+       if (index == 1) {
+               if (init == USB_INIT_DEVICE) {
+                       struct power_domain pd;
+                       int ret;
+
+                       /* Power on usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+
+                       ret = cdns3_uboot_init(&cdns3_device_data);
+                       printf("%d cdns3_uboot_initmode %d\n", index, ret);
+               }
+       }
+       return ret;
+}
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+       int ret = 0;
+
+       if (index == 1) {
+               if (init == USB_INIT_DEVICE) {
+                       struct power_domain pd;
+                       int ret;
+
+                       cdns3_uboot_exit(1);
+
+                       /* Power off usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+               }
+       }
+       return ret;
+}
+#endif
+
 int board_init(void)
 {
 #ifdef CONFIG_MXC_GPIO
@@ -586,30 +663,6 @@ int is_recovery_key_pressing(void)
 #endif /*CONFIG_ANDROID_RECOVERY*/
 #endif /*CONFIG_FSL_FASTBOOT*/
 
-/* Only Enable USB3 resources currently */
-int board_usb_init(int index, enum usb_init_type init)
-{
-#ifndef CONFIG_DM_USB
-       struct power_domain pd;
-       int ret;
-
-       /* Power on usb */
-       if (!power_domain_lookup_name("conn_usb2", &pd)) {
-               ret = power_domain_on(&pd);
-               if (ret)
-                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
-       }
-
-       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
-               ret = power_domain_on(&pd);
-               if (ret)
-                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
-       }
-#endif
-
-       return 0;
-}
-
 #if defined(CONFIG_VIDEO_IMXDPUV1)
 static void enable_lvds(struct display_info_t const *dev)
 {
index 24925a0..4168732 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2017 NXP
+ * Copyright 2017-2018 NXP
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -29,6 +29,7 @@
 #include <asm/arch/video_common.h>
 #include <power-domain.h>
 #include "../common/tcpc.h"
+#include <cdns3-uboot.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -462,12 +463,53 @@ static void setup_typec(void)
        tcpc_init(&port, port_config, &ss_mux_select);
 }
 
+static struct cdns3_device cdns3_device_data = {
+       .none_core_base = 0x5B110000,
+       .xhci_base = 0x5B130000,
+       .dev_base = 0x5B140000,
+       .phy_base = 0x5B160000,
+       .otg_base = 0x5B120000,
+       .dr_mode = USB_DR_MODE_PERIPHERAL,
+       .index = 1,
+};
+
+int usb_gadget_handle_interrupts(void)
+{
+       cdns3_uboot_handle_interrupt(1);
+       return 0;
+}
+
 int board_usb_init(int index, enum usb_init_type init)
 {
        int ret = 0;
 
-       if (init == USB_INIT_HOST)
-               ret = tcpc_setup_dfp_mode(&port);
+       if (index == 1) {
+               if (init == USB_INIT_HOST) {
+                       ret = tcpc_setup_dfp_mode(&port);
+               } else {
+                       struct power_domain pd;
+                       int ret;
+
+                       /* Power on usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_on(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+
+                       ret = tcpc_setup_ufp_mode(&port);
+                       printf("%d setufp mode %d\n", index, ret);
+
+                       ret = cdns3_uboot_init(&cdns3_device_data);
+                       printf("%d cdns3_uboot_initmode %d\n", index, ret);
+               }
+       }
 
        return ret;
 
@@ -477,8 +519,29 @@ int board_usb_cleanup(int index, enum usb_init_type init)
 {
        int ret = 0;
 
-       if (init == USB_INIT_HOST)
-               ret = tcpc_disable_src_vbus(&port);
+       if (index == 1) {
+               if (init == USB_INIT_HOST) {
+                       ret = tcpc_disable_src_vbus(&port);
+               } else {
+                       struct power_domain pd;
+                       int ret;
+
+                       cdns3_uboot_exit(1);
+
+                       /* Power off usb */
+                       if (!power_domain_lookup_name("conn_usb2", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2 Power up failed! (error = %d)\n", ret);
+                       }
+
+                       if (!power_domain_lookup_name("conn_usb2_phy", &pd)) {
+                               ret = power_domain_off(&pd);
+                               if (ret)
+                                       printf("conn_usb2_phy Power up failed! (error = %d)\n", ret);
+                       }
+               }
+       }
 
        return ret;
 }