summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2021-05-22 23:48:54 -0700
committerYe Li <ye.li@nxp.com>2022-04-06 18:04:34 +0800
commitf2ff8eb9f9850ebb8dcf5bcc5c15efddb754ca15 (patch)
tree7c9fd0f79caa1af8dd81d1e3a5cbb3ef76344c01 /arch
parenta58b0743928c4ae8a67c8aa0050068ed1527052f (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.h6
-rw-r--r--arch/arm/include/asm/mach-imx/boot_mode.h1
-rw-r--r--arch/arm/mach-imx/imx8ulp/soc.c39
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