From 1fb61cd80af59c39d1ca01d833f566628ba48f32 Mon Sep 17 00:00:00 2001 From: Ye Li <ye.li@nxp.com> Date: Thu, 2 Mar 2017 11:35:49 +0800 Subject: [PATCH] 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> --- arch/arm/cpu/armv7/mx7ulp/soc.c | 38 ++++++++++++--------- arch/arm/include/asm/arch-mx7ulp/imx-regs.h | 19 +++++++++++ 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 4051e4c002..c004cb87e7 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 = SD1_BOOT; - else - boot_dev = MMC1_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 f2bf50b0c3..ecd07d3d4a 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 df768585c2..980cadcbae 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, }; -- GitLab