diff options
-rw-r--r-- | arch/arm/mach-imx/imx8/cpu.c | 49 | ||||
-rw-r--r-- | cmd/fastboot.c | 23 | ||||
-rw-r--r-- | common/spl/spl_sdp.c | 7 | ||||
-rw-r--r-- | drivers/usb/gadget/g_dnl.c | 5 | ||||
-rw-r--r-- | include/configs/imx_env.h | 8 | ||||
-rw-r--r-- | include/g_dnl.h | 1 |
6 files changed, 84 insertions, 9 deletions
diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c index 6a5fad9207c..1739fd190bd 100644 --- a/arch/arm/mach-imx/imx8/cpu.c +++ b/arch/arm/mach-imx/imx8/cpu.c @@ -13,6 +13,7 @@ #include <dm/lists.h> #include <dm/uclass.h> #include <errno.h> +#include <asm/arch/clock.h> #include <power-domain.h> #include <dm/device.h> #include <dm/uclass-internal.h> @@ -1066,3 +1067,51 @@ void board_boot_order(u32 *spl_boot_list) spl_boot_list[0] = BOOT_DEVICE_NOR; } } + +#ifdef CONFIG_USB_PORT_AUTO +int board_usb_gadget_port_auto(void) +{ + int ret; + u32 usb2_data; + struct power_domain pd; + struct power_domain phy_pd; + + if (!power_domain_lookup_name("conn_usb0", &pd)) { + ret = power_domain_on(&pd); + if (ret) { + printf("conn_usb0 Power up failed!\n"); + return ret; + } + + if (!power_domain_lookup_name("conn_usb0_phy", &phy_pd)) { + ret = power_domain_on(&phy_pd); + if (ret) { + printf("conn_usb0_phy Power up failed!\n"); + return ret; + } + } else { + return -1; + } + + enable_usboh3_clk(1); + usb2_data = readl(USB_BASE_ADDR + 0x154); + + ret = power_domain_off(&phy_pd); + if (ret) { + printf("conn_usb0_phy Power off failed!\n"); + return ret; + } + ret = power_domain_off(&pd); + if (ret) { + printf("conn_usb0 Power off failed!\n"); + return ret; + } + + if (!usb2_data) + return 1; + else + return 0; + } + return -1; +} +#endif diff --git a/cmd/fastboot.c b/cmd/fastboot.c index ddb5ea624a1..6210d263288 100644 --- a/cmd/fastboot.c +++ b/cmd/fastboot.c @@ -41,19 +41,28 @@ static int do_fastboot_usb(int argc, char *const argv[], char *usb_controller; char *endp; int ret; + int index; if (argc < 2) return CMD_RET_USAGE; - usb_controller = argv[1]; - controller_index = simple_strtoul(usb_controller, &endp, 0); - if (*endp != '\0') { - pr_err("Error: Wrong USB controller index format\n"); - return CMD_RET_FAILURE; - } + if (!strcmp(argv[1], "auto")) { + index = board_usb_gadget_port_auto(); + if (index >= 0) + controller_index = index; + else + return CMD_RET_USAGE; + } else { + usb_controller = argv[1]; + controller_index = simple_strtoul(usb_controller, &endp, 0); + if (*endp != '\0') { + pr_err("Error: Wrong USB controller index format\n"); + return CMD_RET_FAILURE; + } #ifdef CONFIG_FASTBOOT_USB_DEV - controller_index = CONFIG_FASTBOOT_USB_DEV; + controller_index = CONFIG_FASTBOOT_USB_DEV; #endif + } ret = usb_gadget_initialize(controller_index); if (ret) { diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c index 644dfa8cc3e..1bf63ce50cd 100644 --- a/common/spl/spl_sdp.c +++ b/common/spl/spl_sdp.c @@ -14,7 +14,12 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { int ret; - const int controller_index = CONFIG_SPL_SDP_USB_DEV; + int index; + int controller_index = CONFIG_SPL_SDP_USB_DEV; + + index = board_usb_gadget_port_auto(); + if (index >= 0) + controller_index = index; usb_gadget_initialize(controller_index); diff --git a/drivers/usb/gadget/g_dnl.c b/drivers/usb/gadget/g_dnl.c index f7d25d8fafd..57cdba4201d 100644 --- a/drivers/usb/gadget/g_dnl.c +++ b/drivers/usb/gadget/g_dnl.c @@ -307,3 +307,8 @@ void g_dnl_unregister(void) { usb_composite_unregister(&g_dnl_driver); } + +int __weak board_usb_gadget_port_auto(void) +{ + return -1; +} diff --git a/include/configs/imx_env.h b/include/configs/imx_env.h index f03f4f2f59b..234af33e55e 100644 --- a/include/configs/imx_env.h +++ b/include/configs/imx_env.h @@ -12,6 +12,12 @@ #define MFG_BOOT_CMD "bootz " #endif +#ifdef CONFIG_USB_PORT_AUTO + #define FASTBOOT_CMD "echo \"Run fastboot ...\"; fastboot auto; " +#else + #define FASTBOOT_CMD "echo \"Run fastboot ...\"; fastboot 0; " +#endif + #define CONFIG_MFG_ENV_SETTINGS_DEFAULT \ "mfgtool_args=setenv bootargs console=${console},${baudrate} " \ "rdinit=/linuxrc " \ @@ -26,7 +32,7 @@ MFG_BOOT_CMD "${loadaddr} ${initrd_addr} ${fdt_addr}; " \ "fi; " \ "else " \ - "echo \"Run fastboot ...\"; fastboot 0; " \ + FASTBOOT_CMD \ "fi;\0" \ #endif diff --git a/include/g_dnl.h b/include/g_dnl.h index 6d461c73d3d..2425d19ed2e 100644 --- a/include/g_dnl.h +++ b/include/g_dnl.h @@ -43,5 +43,6 @@ bool g_dnl_detach(void); void g_dnl_trigger_detach(void); void g_dnl_clear_detach(void); int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget); +int board_usb_gadget_port_auto(void); #endif /* __G_DOWNLOAD_H_ */ |