From: Ye Li Date: Mon, 19 Mar 2018 05:34:31 +0000 (-0700) Subject: MLK-17821-3 imx8qxp/qm: Add board codes to adapt CDNS3 USB gadget driver X-Git-Tag: rel_imx_4.9.88_2.0.0_ga~32 X-Git-Url: https://git.somdevices.com/?a=commitdiff_plain;h=ae52af090835c6e43c1b06853c937f8b01ab8cf6;p=u-boot.git MLK-17821-3 imx8qxp/qm: Add board codes to adapt CDNS3 USB gadget driver 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 Reviewed-by: Peng Fan --- diff --git a/board/freescale/imx8qm_arm2/imx8qm_arm2.c b/board/freescale/imx8qm_arm2/imx8qm_arm2.c index c31e5d159d..e3bbfd3221 100644 --- a/board/freescale/imx8qm_arm2/imx8qm_arm2.c +++ b/board/freescale/imx8qm_arm2/imx8qm_arm2.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 NXP + * Copyright 2017-2018 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -28,6 +28,7 @@ #include #include #include +#include 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) { diff --git a/board/freescale/imx8qm_mek/imx8qm_mek.c b/board/freescale/imx8qm_mek/imx8qm_mek.c index 4546dac8bf..598df72a5d 100644 --- a/board/freescale/imx8qm_mek/imx8qm_mek.c +++ b/board/freescale/imx8qm_mek/imx8qm_mek.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 NXP + * Copyright 2017-2018 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -28,6 +28,7 @@ #include #include #include "../common/tcpc.h" +#include 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 diff --git a/board/freescale/imx8qxp_arm2/imx8qxp_arm2.c b/board/freescale/imx8qxp_arm2/imx8qxp_arm2.c index 5eb61b0683..d3a4e2ff2f 100644 --- a/board/freescale/imx8qxp_arm2/imx8qxp_arm2.c +++ b/board/freescale/imx8qxp_arm2/imx8qxp_arm2.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 NXP + * Copyright 2017-2018 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -29,6 +29,7 @@ #include #include #include +#include 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) { diff --git a/board/freescale/imx8qxp_mek/imx8qxp_mek.c b/board/freescale/imx8qxp_mek/imx8qxp_mek.c index 24925a0266..416873266d 100644 --- a/board/freescale/imx8qxp_mek/imx8qxp_mek.c +++ b/board/freescale/imx8qxp_mek/imx8qxp_mek.c @@ -1,5 +1,5 @@ /* - * Copyright 2017 NXP + * Copyright 2017-2018 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -29,6 +29,7 @@ #include #include #include "../common/tcpc.h" +#include 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; }