[PATCH 01/13] imx: lowlevel: implement armv8_el2_to_aarch32

From: Peng Fan peng.fan@nxp.com
Implement armv8_el2_to_aarch32 for aarch64 U-Boot booting aarch32 SMP linux. It will trap to ATF to let ATF handle the mode switching.
Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/lowlevel.S | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/arch/arm/mach-imx/lowlevel.S b/arch/arm/mach-imx/lowlevel.S index 158fdb7d87..c500aa8123 100644 --- a/arch/arm/mach-imx/lowlevel.S +++ b/arch/arm/mach-imx/lowlevel.S @@ -20,3 +20,26 @@ ENTRY(lowlevel_init) isb ret ENDPROC(lowlevel_init) + +/* + * Switch from AArch64 EL2 to AArch32 EL2 + * @param inputs: + * x0: argument, zero + * x1: machine nr + * x2: fdt address + * x3: input argument + * x4: kernel entry point + * @param outputs for secure firmware: + * x0: function id + * x1: kernel entry point + * x2: machine nr + * x3: fdt address +*/ +.global armv8_el2_to_aarch32 +armv8_el2_to_aarch32: + mov x3, x2 + mov x2, x1 + mov x1, x4 + ldr x0, =0xc20000fd + smc #0 + ret

From: Ye Li ye.li@nxp.com
Fix Coverity Issue 9006654. In write_fcb, use of an uninitialized variable "ret".
Signed-off-by: Ye Li ye.li@nxp.com Reviewed-by: Peng Fan peng.fan@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cmd_nandbcb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index 44fc37695d..c01f6aea73 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -563,7 +563,7 @@ static int write_fcb(struct boot_config *boot_cfg, struct fcb_block *fcb) { struct mtd_info *mtd; void *fcb_raw_page = NULL; - int i, ret; + int i, ret = 0; loff_t off; size_t size;

From: Ye Li ye.li@nxp.com
Fix Coverity Issue 9006655. In write_fcb, leak of memory to resource "fcb_raw_page". Since we have initialized the "ret" to 0, should return the value of ret.
Signed-off-by: Ye Li ye.li@nxp.com Reviewed-by: Peng Fan peng.fan@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cmd_nandbcb.c | 2 -- 1 file changed, 2 deletions(-)
diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index c01f6aea73..6e50471164 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -653,8 +653,6 @@ static int write_fcb(struct boot_config *boot_cfg, struct fcb_block *fcb) off += g_boot_search_stride; }
- return 0; - fcb_raw_page_err: kfree(fcb_raw_page);

From: Ye Li ye.li@nxp.com
Fix Coverity Issue 9006657. In read_fcb, leak of memory to system resource "fcb_raw_page". Adjust the sequence to check the mtd bad block prior than allocation of "fcb_raw_page", also check the NULL return of allocation.
Signed-off-by: Ye Li ye.li@nxp.com Reviewed-by: Peng Fan peng.fan@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cmd_nandbcb.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index 6e50471164..836981c895 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -503,13 +503,18 @@ static int read_fcb(struct boot_config *boot_cfg, struct fcb_block *fcb, int ret = 0;
mtd = boot_cfg->mtd; - fcb_raw_page = kzalloc(mtd->writesize + mtd->oobsize, GFP_KERNEL); - if (mtd_block_isbad(mtd, off)) { printf("Block %d is bad, skipped\n", (int)CONV_TO_BLOCKS(off)); return 1; }
+ fcb_raw_page = kzalloc(mtd->writesize + mtd->oobsize, GFP_KERNEL); + if (!fcb_raw_page) { + debug("failed to allocate fcb_raw_page\n"); + ret = -ENOMEM; + return ret; + } + /* * User BCH hardware to decode ECC for FCB */

From: Ye Li ye.li@nxp.com
Fix Coverity Issue 9006658. In fill_dbbt_data, an integer overflow occurs, with the result converted to a wider integer type
Signed-off-by: Ye Li ye.li@nxp.com Reviewed-by: Peng Fan peng.fan@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cmd_nandbcb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index 836981c895..ea4e147da8 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -476,7 +476,7 @@ static int fill_dbbt_data(struct mtd_info *mtd, void *buf, int num_blocks) u32 *n_bad_blocksp = buf + 0x4;
for (n = 0; n < num_blocks; n++) { - loff_t offset = n * mtd->erasesize; + loff_t offset = (loff_t)n * mtd->erasesize; if (mtd_block_isbad(mtd, offset)) { n_bad_blocks++; *bb = n;

From: Ye Li ye.li@nxp.com
Fix Coverity Issue 9006656. In nandbcb_set_boot_config, an integer overflow occurs, with the result converted to a wider integer type.
Signed-off-by: Ye Li ye.li@nxp.com Reviewed-by: Peng Fan peng.fan@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cmd_nandbcb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index ea4e147da8..028b7c4835 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -275,7 +275,8 @@ static int nandbcb_set_boot_config(int argc, char * const argv[], boot_stream1_address);
if (boot_cfg->secondary_boot_stream_off_in_MB) - boot_stream2_address = boot_cfg->secondary_boot_stream_off_in_MB * 1024 * 1024; + boot_stream2_address = + (loff_t)boot_cfg->secondary_boot_stream_off_in_MB * 1024 * 1024;
max_boot_stream_size = boot_stream2_address - boot_stream1_address;

From: Han Xu han.xu@nxp.com
Add NAND boot support for i.MX8MP by adding i.MX8MP in nandbcb support list, reading boot_search_count from fuse.
i.MX8MN NAND boot is same as i.MX8MP, fix some issues as well.
Signed-off-by: Han Xu han.xu@nxp.com Reviewed-by: Ye Li ye.li@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cmd_nandbcb.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/arch/arm/mach-imx/cmd_nandbcb.c b/arch/arm/mach-imx/cmd_nandbcb.c index 028b7c4835..7157c9e979 100644 --- a/arch/arm/mach-imx/cmd_nandbcb.c +++ b/arch/arm/mach-imx/cmd_nandbcb.c @@ -1487,7 +1487,7 @@ static int do_nandbcb(struct cmd_tbl *cmdtp, int flag, int argc, plat_config = imx8mq_plat_config; } else if (is_imx8mm()) { plat_config = imx8mm_plat_config; - } else if (is_imx8mn()) { + } else if (is_imx8mn() || is_imx8mp()) { plat_config = imx8mn_plat_config; } else if (is_imx8qm() || is_imx8qxp()) { plat_config = imx8q_plat_config; @@ -1496,13 +1496,13 @@ static int do_nandbcb(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_FAILURE; }
- if (plat_config.misc_flags & BT_SEARCH_CNT_FROM_FUSE) { - if (is_imx8qxp()) { - g_boot_search_count = fuse_to_search_count(0, 720, - 0xc0, 6); - printf("search count set to %d from fuse\n", - g_boot_search_count); - } + if ((plat_config.misc_flags) & BT_SEARCH_CNT_FROM_FUSE) { + if (is_imx8qxp()) + g_boot_search_count = fuse_to_search_count(0, 720, 0xc0, 6); + if (is_imx8mn() || is_imx8mp()) + g_boot_search_count = fuse_to_search_count(2, 2, 0x6000, 13); + printf("search count set to %d from fuse\n", + g_boot_search_count); }
cmd = argv[1];

From: Ye Li ye.li@nxp.com
iMX8MP has shifted market segment fuse one bit from 0x440 [7:6] to [6:5], correct it in imx common codes.
Signed-off-by: Ye Li ye.li@nxp.com Reviewed-by: Peng Fan peng.fan@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cpu.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index a4d8f101b6..425d0f0327 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -385,6 +385,9 @@ u32 get_cpu_speed_grade_hz(void) */ #define OCOTP_TESTER3_TEMP_SHIFT 6
+/* iMX8MP uses OCOTP_TESTER3[6:5] for Market segment */ +#define IMX8MP_OCOTP_TESTER3_TEMP_SHIFT 5 + u32 get_cpu_temp_grade(int *minc, int *maxc) { struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR; @@ -394,7 +397,10 @@ u32 get_cpu_temp_grade(int *minc, int *maxc) uint32_t val;
val = readl(&fuse->tester3); - val >>= OCOTP_TESTER3_TEMP_SHIFT; + if (is_imx8mp()) + val >>= IMX8MP_OCOTP_TESTER3_TEMP_SHIFT; + else + val >>= OCOTP_TESTER3_TEMP_SHIFT; val &= 0x3;
if (minc && maxc) {

From: Ye Li ye.li@nxp.com
Since we remove SATA device before boot OS, when AHCI is enabled, update the codes to remove AHCI device.
Signed-off-by: Ye Li ye.li@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cpu.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index 425d0f0327..af0b7fbf7b 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -24,6 +24,8 @@ #include <ipu_pixfmt.h> #include <thermal.h> #include <sata.h> +#include <dm/device-internal.h> +#include <dm/uclass-internal.h>
#ifdef CONFIG_FSL_ESDHC_IMX #include <fsl_esdhc_imx.h> @@ -278,6 +280,20 @@ void arch_preboot_os(void) #if defined(CONFIG_PCIE_IMX) && !CONFIG_IS_ENABLED(DM_PCI) imx_pcie_remove(); #endif + +#if defined(CONFIG_IMX_AHCI) + struct udevice *dev; + int rc; + + rc = uclass_find_device(UCLASS_AHCI, 0, &dev); + if (!rc && dev) { + rc = device_remove(dev, DM_REMOVE_NORMAL); + if (rc) + printf("Cannot remove SATA device '%s' (err=%d)\n", + dev->name, rc); + } +#endif + #if defined(CONFIG_SATA) if (!is_mx6sdl()) { sata_remove(0);

From: Peng Fan peng.fan@nxp.com
When boot type could not be detected from rom sw info, read sbmr1 to detect, here we only use it to detect FLEXSPI boot, because ROM not update it in rom sw info.
Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/cpu.c | 6 ++++-- arch/arm/mach-imx/spl.c | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c index af0b7fbf7b..38b87ed5c3 100644 --- a/arch/arm/mach-imx/cpu.c +++ b/arch/arm/mach-imx/cpu.c @@ -467,12 +467,14 @@ enum boot_device get_boot_device(void) case BOOT_TYPE_SPINOR: boot_dev = SPI_NOR_BOOT; break; -#ifdef CONFIG_IMX8M case BOOT_TYPE_USB: boot_dev = USB_BOOT; break; -#endif default: +#ifdef CONFIG_IMX8M + if (((readl(SRC_BASE_ADDR + 0x58) & 0x00007FFF) >> 12) == 0x4) + boot_dev = QSPI_BOOT; +#endif break; }
diff --git a/arch/arm/mach-imx/spl.c b/arch/arm/mach-imx/spl.c index aa2686bb92..2d15f62445 100644 --- a/arch/arm/mach-imx/spl.c +++ b/arch/arm/mach-imx/spl.c @@ -172,6 +172,8 @@ u32 spl_boot_device(void) return BOOT_DEVICE_NAND; case SPI_NOR_BOOT: return BOOT_DEVICE_SPI; + case QSPI_BOOT: + return BOOT_DEVICE_NOR; case USB_BOOT: return BOOT_DEVICE_USB; default:

From: Ye Li ye.li@nxp.com
Since we enabled MMC alias, the USDHC index in u-boot is the usdhc port. So we don't need to convert them for kernel and u-boot env device.
Signed-off-by: Ye Li ye.li@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/imx8/cpu.c | 2 +- arch/arm/mach-imx/mmc_env.c | 2 +- arch/arm/mach-imx/mx6/soc.c | 2 +- arch/arm/mach-imx/mx7ulp/soc.c | 2 +- board/freescale/imx8mm_evk/imx8mm_evk.c | 9 ++++----- board/freescale/imx8mq_evk/imx8mq_evk.c | 9 ++++----- board/freescale/imx8qm_mek/imx8qm_mek.c | 8 +++----- board/freescale/imx8qxp_mek/imx8qxp_mek.c | 9 ++++----- board/freescale/mx6sabreauto/mx6sabreauto.c | 4 ++++ board/freescale/mx6sabresd/mx6sabresd.c | 4 ++++ board/freescale/mx6slevk/mx6slevk.c | 5 ----- 11 files changed, 27 insertions(+), 29 deletions(-)
diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c index 911d6a51d1..bdd4b87192 100644 --- a/arch/arm/mach-imx/imx8/cpu.c +++ b/arch/arm/mach-imx/imx8/cpu.c @@ -205,7 +205,7 @@ void get_board_serial(struct tag_serialnr *serialnr) #ifdef CONFIG_ENV_IS_IN_MMC __weak int board_mmc_get_env_dev(int devno) { - return CONFIG_SYS_MMC_ENV_DEV; + return devno; }
int mmc_get_env_dev(void) diff --git a/arch/arm/mach-imx/mmc_env.c b/arch/arm/mach-imx/mmc_env.c index 9c822f721c..9c1d3cdfcb 100644 --- a/arch/arm/mach-imx/mmc_env.c +++ b/arch/arm/mach-imx/mmc_env.c @@ -11,7 +11,7 @@
__weak int board_mmc_get_env_dev(int devno) { - return CONFIG_SYS_MMC_ENV_DEV; + return devno; }
int mmc_get_env_dev(void) diff --git a/arch/arm/mach-imx/mx6/soc.c b/arch/arm/mach-imx/mx6/soc.c index f43a2460f9..5c6eddef3b 100644 --- a/arch/arm/mach-imx/mx6/soc.c +++ b/arch/arm/mach-imx/mx6/soc.c @@ -492,7 +492,7 @@ int arch_cpu_init(void) #ifdef CONFIG_ENV_IS_IN_MMC __weak int board_mmc_get_env_dev(int devno) { - return CONFIG_SYS_MMC_ENV_DEV; + return devno; }
static int mmc_get_boot_dev(void) diff --git a/arch/arm/mach-imx/mx7ulp/soc.c b/arch/arm/mach-imx/mx7ulp/soc.c index 8dd6b4d40e..6dcb8e736f 100644 --- a/arch/arm/mach-imx/mx7ulp/soc.c +++ b/arch/arm/mach-imx/mx7ulp/soc.c @@ -319,7 +319,7 @@ static char *get_reset_cause(char *ret) #ifdef CONFIG_ENV_IS_IN_MMC __weak int board_mmc_get_env_dev(int devno) { - return CONFIG_SYS_MMC_ENV_DEV; + return devno; }
int mmc_get_env_dev(void) diff --git a/board/freescale/imx8mm_evk/imx8mm_evk.c b/board/freescale/imx8mm_evk/imx8mm_evk.c index 6af7100696..02dfe5bd22 100644 --- a/board/freescale/imx8mm_evk/imx8mm_evk.c +++ b/board/freescale/imx8mm_evk/imx8mm_evk.c @@ -52,13 +52,12 @@ int board_init(void) return 0; }
-int board_mmc_get_env_dev(int devno) -{ - return devno; -} - int board_late_init(void) { +#ifdef CONFIG_ENV_IS_IN_MMC + board_late_mmc_env_init(); +#endif + #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG env_set("board_name", "EVK"); env_set("board_rev", "iMX8MM"); diff --git a/board/freescale/imx8mq_evk/imx8mq_evk.c b/board/freescale/imx8mq_evk/imx8mq_evk.c index 1ad670b8cc..a1a77041fa 100644 --- a/board/freescale/imx8mq_evk/imx8mq_evk.c +++ b/board/freescale/imx8mq_evk/imx8mq_evk.c @@ -88,11 +88,6 @@ int board_init(void) return 0; }
-int board_mmc_get_env_dev(int devno) -{ - return devno; -} - int board_late_init(void) { #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG @@ -100,5 +95,9 @@ int board_late_init(void) env_set("board_rev", "iMX8MQ"); #endif
+#ifdef CONFIG_ENV_IS_IN_MMC + board_late_mmc_env_init(); +#endif + return 0; } diff --git a/board/freescale/imx8qm_mek/imx8qm_mek.c b/board/freescale/imx8qm_mek/imx8qm_mek.c index fba3baa126..106e7127dc 100644 --- a/board/freescale/imx8qm_mek/imx8qm_mek.c +++ b/board/freescale/imx8qm_mek/imx8qm_mek.c @@ -116,11 +116,6 @@ int ft_board_setup(void *blob, struct bd_info *bd) } #endif
-int board_mmc_get_env_dev(int devno) -{ - return devno; -} - int board_late_init(void) { char *fdt_file; @@ -141,5 +136,8 @@ int board_late_init(void) env_set("fdt_file", "imx8qm-mek.dtb"); }
+#ifdef CONFIG_ENV_IS_IN_MMC + board_late_mmc_env_init(); +#endif return 0; } diff --git a/board/freescale/imx8qxp_mek/imx8qxp_mek.c b/board/freescale/imx8qxp_mek/imx8qxp_mek.c index da55933e21..6576ee112e 100644 --- a/board/freescale/imx8qxp_mek/imx8qxp_mek.c +++ b/board/freescale/imx8qxp_mek/imx8qxp_mek.c @@ -140,11 +140,6 @@ int ft_board_setup(void *blob, struct bd_info *bd) } #endif
-int board_mmc_get_env_dev(int devno) -{ - return devno; -} - int board_late_init(void) { char *fdt_file; @@ -165,5 +160,9 @@ int board_late_init(void) env_set("fdt_file", "imx8qxp-mek.dtb"); }
+#ifdef CONFIG_ENV_IS_IN_MMC + board_late_mmc_env_init(); +#endif + return 0; } diff --git a/board/freescale/mx6sabreauto/mx6sabreauto.c b/board/freescale/mx6sabreauto/mx6sabreauto.c index c031cf8538..55ff7c607c 100644 --- a/board/freescale/mx6sabreauto/mx6sabreauto.c +++ b/board/freescale/mx6sabreauto/mx6sabreauto.c @@ -594,6 +594,10 @@ int board_late_init(void) env_set("board_rev", "MX6DL"); #endif
+#ifdef CONFIG_ENV_IS_IN_MMC + board_late_mmc_env_init(); +#endif + return 0; }
diff --git a/board/freescale/mx6sabresd/mx6sabresd.c b/board/freescale/mx6sabresd/mx6sabresd.c index 9a176f4711..cc336fd8dd 100644 --- a/board/freescale/mx6sabresd/mx6sabresd.c +++ b/board/freescale/mx6sabresd/mx6sabresd.c @@ -572,6 +572,10 @@ int board_late_init(void) env_set("board_rev", "MX6DL"); #endif
+#ifdef CONFIG_ENV_IS_IN_MMC + board_late_mmc_env_init(); +#endif + return 0; }
diff --git a/board/freescale/mx6slevk/mx6slevk.c b/board/freescale/mx6slevk/mx6slevk.c index 5d2f815d23..92ecdb4d3d 100644 --- a/board/freescale/mx6slevk/mx6slevk.c +++ b/board/freescale/mx6slevk/mx6slevk.c @@ -108,11 +108,6 @@ static void setup_iomux_uart(void) imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads)); }
-int board_mmc_get_env_dev(int devno) -{ - return devno; -} - #ifdef CONFIG_DM_PMIC_PFUZE100 int power_init_board(void) {

From: Frank Li Frank.Li@nxp.com
uuu can change emmc device number for fastboot
Signed-off-by: Frank Li Frank.Li@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/mmc_env.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/mmc_env.c b/arch/arm/mach-imx/mmc_env.c index 9c1d3cdfcb..22d8daa107 100644 --- a/arch/arm/mach-imx/mmc_env.c +++ b/arch/arm/mach-imx/mmc_env.c @@ -23,7 +23,7 @@ int mmc_get_env_dev(void)
/* If not boot from sd/mmc, use default value */ if ((boot_type != BOOT_TYPE_SD) && (boot_type != BOOT_TYPE_MMC)) - return CONFIG_SYS_MMC_ENV_DEV; + return env_get_ulong("mmcdev", 10, CONFIG_SYS_MMC_ENV_DEV);
return board_mmc_get_env_dev(devno); }

From: Ye Li ye.li@nxp.com
Modify the GPT common platform driver for mx7 which only use 24Mhz OSC as clock source.
Note: at default, the mx7d will use system counter as timer. The GPT is disabled.
Signed-off-by: Ye Li ye.li@nxp.com Signed-off-by: Peng Fan peng.fan@nxp.com --- arch/arm/mach-imx/timer.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/arch/arm/mach-imx/timer.c b/arch/arm/mach-imx/timer.c index fa1941aec4..a3c47889f1 100644 --- a/arch/arm/mach-imx/timer.c +++ b/arch/arm/mach-imx/timer.c @@ -39,18 +39,16 @@ static struct mxc_gpt *cur_gpt = (struct mxc_gpt *)GPT1_BASE_ADDR; #define GPTPR_PRESCALER24M_SHIFT 12 #define GPTPR_PRESCALER24M_MASK (0xF << GPTPR_PRESCALER24M_SHIFT)
+DECLARE_GLOBAL_DATA_PTR; + static inline int gpt_has_clk_source_osc(void) { -#if defined(CONFIG_MX6) if (((is_mx6dq()) && (soc_rev() > CHIP_REV_1_0)) || is_mx6dqp() || is_mx6sdl() || is_mx6sx() || is_mx6ul() || - is_mx6ull() || is_mx6sll()) + is_mx6ull() || is_mx6sll() || is_mx7()) return 1;
return 0; -#else - return 0; -#endif }
static inline ulong gpt_get_clk(void) @@ -73,7 +71,8 @@ int timer_init(void) __raw_writel(GPTCR_SWR, &cur_gpt->control);
/* We have no udelay by now */ - __raw_writel(0, &cur_gpt->control); + for (i = 0; i < 100; i++) + __raw_writel(0, &cur_gpt->control);
i = __raw_readl(&cur_gpt->control); i &= ~GPTCR_CLKSOURCE_MASK; @@ -87,7 +86,7 @@ int timer_init(void) * Enable bit and prescaler */ if (is_mx6sdl() || is_mx6sx() || is_mx6ul() || is_mx6ull() || - is_mx6sll()) { + is_mx6sll() || is_mx7()) { i |= GPTCR_24MEN;
/* Produce 3Mhz clock */ @@ -103,6 +102,9 @@ int timer_init(void) #endif __raw_writel(i, &cur_gpt->control);
+ gd->arch.tbl = __raw_readl(&cur_gpt->counter); + gd->arch.tbu = 0; + return 0; }
participants (1)
-
Peng Fan (OSS)