diff options
author | Ye Li <ye.li@nxp.com> | 2021-05-22 23:48:54 -0700 |
---|---|---|
committer | Ye Li <ye.li@nxp.com> | 2022-04-06 18:04:34 +0800 |
commit | f2ff8eb9f9850ebb8dcf5bcc5c15efddb754ca15 (patch) | |
tree | 7c9fd0f79caa1af8dd81d1e3a5cbb3ef76344c01 /arch | |
parent | a58b0743928c4ae8a67c8aa0050068ed1527052f (diff) |
MLK-25504-36 arm: iMX8ULP: Add boot device relevant functions
Using ROM API to get boot device and checks it for MMC ENV device
and USB boot device
Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit d3c6167fb9def3cbdf89d8c93cbc8f1b2f1d2c41)
(cherry picked from commit e85dab751d7c9459276840823df0c63acf8e3272)
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/include/asm/arch-imx8ulp/imx-regs.h | 6 | ||||
-rw-r--r-- | arch/arm/include/asm/mach-imx/boot_mode.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-imx/imx8ulp/soc.c | 39 |
3 files changed, 43 insertions, 3 deletions
diff --git a/arch/arm/include/asm/arch-imx8ulp/imx-regs.h b/arch/arm/include/asm/arch-imx8ulp/imx-regs.h index 91adc85525c..a00a7ef82c3 100644 --- a/arch/arm/include/asm/arch-imx8ulp/imx-regs.h +++ b/arch/arm/include/asm/arch-imx8ulp/imx-regs.h @@ -158,6 +158,12 @@ struct usbphy_regs { u32 usb1_pfda_ctrl1_clr; /* 0x148 */ u32 usb1_pfda_ctrl1_tog; /* 0x14c */ }; + +#include <stdbool.h> +bool is_usb_boot(void); +void disconnect_from_pc(void); +#define is_boot_from_usb is_usb_boot + #endif #endif diff --git a/arch/arm/include/asm/mach-imx/boot_mode.h b/arch/arm/include/asm/mach-imx/boot_mode.h index 6dc58559680..a568c443722 100644 --- a/arch/arm/include/asm/mach-imx/boot_mode.h +++ b/arch/arm/include/asm/mach-imx/boot_mode.h @@ -29,6 +29,7 @@ enum boot_device { QSPI_BOOT, FLEXSPI_BOOT, USB_BOOT, + USB2_BOOT, UNKNOWN_BOOT, BOOT_DEV_NUM = UNKNOWN_BOOT, }; diff --git a/arch/arm/mach-imx/imx8ulp/soc.c b/arch/arm/mach-imx/imx8ulp/soc.c index 934b0ef038c..4fa41345635 100644 --- a/arch/arm/mach-imx/imx8ulp/soc.c +++ b/arch/arm/mach-imx/imx8ulp/soc.c @@ -65,18 +65,33 @@ enum boot_device get_boot_device(void) boot_dev = QSPI_BOOT; break; case BT_DEV_TYPE_USB: - boot_dev = USB_BOOT; + boot_dev = boot_instance + USB_BOOT; break; default: break; } + debug("boot dev %d\n", boot_dev); + return boot_dev; } bool is_usb_boot(void) { - return get_boot_device() == USB_BOOT; + enum boot_device bt_dev = get_boot_device(); + return (bt_dev == USB_BOOT || bt_dev == USB2_BOOT); +} + +void disconnect_from_pc(void) +{ + enum boot_device bt_dev = get_boot_device(); + + if (bt_dev == USB_BOOT) + writel(0x0, USBOTG0_RBASE + 0x140); + else if (bt_dev == USB2_BOOT) + writel(0x0, USBOTG1_RBASE + 0x140); + + return; } #ifdef CONFIG_ENV_IS_IN_MMC @@ -105,11 +120,29 @@ int mmc_get_env_dev(void) boot_type = boot >> 16; boot_instance = (boot >> 8) & 0xff; + debug("boot_type %d, instance %d\n", boot_type, boot_instance); + /* If not boot from sd/mmc, use default value */ - if (boot_type != BOOT_TYPE_SD && boot_type != BOOT_TYPE_MMC) + if ((boot_type != BOOT_TYPE_SD) && (boot_type != BOOT_TYPE_MMC)) return env_get_ulong("mmcdev", 10, CONFIG_SYS_MMC_ENV_DEV); return board_mmc_get_env_dev(boot_instance); + +} +#endif + +#ifdef CONFIG_USB_PORT_AUTO +int board_usb_gadget_port_auto(void) +{ + enum boot_device bt_dev = get_boot_device(); + int usb_boot_index = 0; + + if (bt_dev == USB2_BOOT) + usb_boot_index = 1; + + printf("auto usb %d\n", usb_boot_index); + + return usb_boot_index; } #endif |