diff options
author | Ye Li <ye.li@nxp.com> | 2017-03-02 11:35:49 +0800 |
---|---|---|
committer | Ye Li <ye.li@nxp.com> | 2017-03-02 17:07:11 +0800 |
commit | 95fa940015031aa12d339fa86a115a3b4e423416 (patch) | |
tree | 059d4438451de2706f2e44c6c19809651cb34edf | |
parent | 49cb68f5c17e42f9290336e1252ace6ac7d0b5ce (diff) | |
download | u-boot-imx-95fa940015031aa12d339fa86a115a3b4e423416.zip u-boot-imx-95fa940015031aa12d339fa86a115a3b4e423416.tar.gz u-boot-imx-95fa940015031aa12d339fa86a115a3b4e423416.tar.bz2 |
MLK-14312 mx7ulp: Fix incorrect DTB modification after using USB
u-boot has feature that when booting for mfgtool, the u-boot will modify the DTB
to disable SD 1.8v switch. But the judgement for mfgtool boot has a problem, it
only checks whether the USB PHY power status is enabled. When a USB device
(for example a USB ethernet) is used in u-boot, the power status is also enabled.
So the u-boot incorrectly disable the SD 1.8v switch.
The patch changes the get_boot_device to use the boot SW info provided by ROM. Only if
it is a USB boot, we will start the DTB modification for SD.
Signed-off-by: Ye Li <ye.li@nxp.com>
(cherry picked from commit 1fb61cd80af59c39d1ca01d833f566628ba48f32)
-rw-r--r-- | arch/arm/cpu/armv7/mx7ulp/soc.c | 38 | ||||
-rw-r--r-- | arch/arm/include/asm/arch-mx7ulp/imx-regs.h | 19 | ||||
-rw-r--r-- | arch/arm/include/asm/imx-common/boot_mode.h | 2 |
3 files changed, 43 insertions, 16 deletions
diff --git a/arch/arm/cpu/armv7/mx7ulp/soc.c b/arch/arm/cpu/armv7/mx7ulp/soc.c index cdd4d42..c004cb8 100644 --- a/arch/arm/cpu/armv7/mx7ulp/soc.c +++ b/arch/arm/cpu/armv7/mx7ulp/soc.c @@ -11,9 +11,7 @@ #include <asm/arch/sys_proto.h> #include <dm.h> #include <asm/imx-common/hab.h> -#ifdef CONFIG_FSL_FASTBOOT #include <asm/imx-common/boot_mode.h> -#endif #include <fdt_support.h> struct lpuart_serial_platdata { @@ -360,8 +358,7 @@ int mmc_get_env_dev(void) #ifdef CONFIG_OF_SYSTEM_SETUP int ft_system_setup(void *blob, bd_t *bd) { -#if !defined(CONFIG_FSL_FASTBOOT) && defined(is_boot_from_usb) - if (is_boot_from_usb()) { + if (get_boot_device() == USB_BOOT) { int rc; int nodeoff = fdt_path_offset(blob, "/ahb-bridge0@40000000/usdhc@40370000"); if (nodeoff < 0) @@ -389,28 +386,37 @@ add: } } } -#endif return 0; } #endif - -#ifdef CONFIG_FSL_FASTBOOT enum boot_device get_boot_device(void) { - bool type; - u32 bt1_cfg = 0; - enum boot_device boot_dev = UNKNOWN_BOOT; + struct bootrom_sw_info **p = + (struct bootrom_sw_info **)ROM_SW_INFO_ADDR; - bt1_cfg = readl(CMC1_RBASE + 0x40); - type = (bt1_cfg >> 8) & 0x1; + enum boot_device boot_dev = SD1_BOOT; + u8 boot_type = (*p)->boot_dev_type; + u8 boot_instance = (*p)->boot_dev_instance; + + switch (boot_type) { + case BOOT_TYPE_SD: + boot_dev = boot_instance + SD1_BOOT; + break; + case BOOT_TYPE_MMC: + boot_dev = boot_instance + MMC1_BOOT; + break; + case BOOT_TYPE_USB: + boot_dev = USB_BOOT; + break; + default: + break; + } - if (type) - boot_dev = MMC1_BOOT; - else - boot_dev = SD1_BOOT; return boot_dev; } + +#ifdef CONFIG_FSL_FASTBOOT #ifdef CONFIG_SERIAL_TAG void get_board_serial(struct tag_serialnr *serialnr) { diff --git a/arch/arm/include/asm/arch-mx7ulp/imx-regs.h b/arch/arm/include/asm/arch-mx7ulp/imx-regs.h index f2bf50b..ecd07d3 100644 --- a/arch/arm/include/asm/arch-mx7ulp/imx-regs.h +++ b/arch/arm/include/asm/arch-mx7ulp/imx-regs.h @@ -10,6 +10,8 @@ #include <linux/sizes.h> +#define ROM_SW_INFO_ADDR 0x000001E8 + #define CAAM_SEC_SRAM_BASE (0x26000000) #define CAAM_SEC_SRAM_SIZE (SZ_32K) #define CAAM_SEC_SRAM_END (CAAM_SEC_SRAM_BASE + CAAM_SEC_SRAM_SIZE - 1) @@ -1205,6 +1207,23 @@ struct lpuart_fsl { #define is_boot_from_usb(void) (!(readl(USB_PHY0_BASE_ADDR) & (1<<20))) #define disconnect_from_pc(void) writel(0x0, USBOTG0_RBASE + 0x140) +/* Boot device type */ +#define BOOT_TYPE_SD 0x1 +#define BOOT_TYPE_MMC 0x2 +#define BOOT_TYPE_USB 0xf + +struct bootrom_sw_info { + u8 reserved_1; + u8 boot_dev_instance; + u8 boot_dev_type; + u8 reserved_2; + u32 core_freq; + u32 axi_freq; + u32 ddr_freq; + u32 rom_tick_freq; + u32 reserved_3[3]; +}; + #endif #endif /* _MX7ULP_REGS_H_*/ diff --git a/arch/arm/include/asm/imx-common/boot_mode.h b/arch/arm/include/asm/imx-common/boot_mode.h index df76858..980cadc 100644 --- a/arch/arm/include/asm/imx-common/boot_mode.h +++ b/arch/arm/include/asm/imx-common/boot_mode.h @@ -2,6 +2,7 @@ * Copyright (C) 2012 Boundary Devices Inc. * * Copyright (C) 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2017 NXP * * SPDX-License-Identifier: GPL-2.0+ */ @@ -28,6 +29,7 @@ enum boot_device { MMC4_BOOT, NAND_BOOT, QSPI_BOOT, + USB_BOOT, UNKNOWN_BOOT, BOOT_DEV_NUM = UNKNOWN_BOOT, }; |