]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
imx8ulp: Workaround LPOSC_TRIM fuse load issue
authorYe Li <ye.li@nxp.com>
Fri, 29 Oct 2021 01:46:25 +0000 (09:46 +0800)
committerStefano Babic <sbabic@denx.de>
Sat, 5 Feb 2022 12:38:39 +0000 (13:38 +0100)
8ULP ROM should read the LPOSC trim BIAS fuse to fill the CGC0
LPOSCCTRL[7:0], but it writes a fixed value on A0.1 revision.

A0.2 will fix the issue in ROM. But A0.1 we have to workaround
it in SPL by setting LPOSCCTRL BIASCURRENT again.

Reviewed-by: Peng Fan <peng.fan@nxp.com>
Signed-off-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/arm/include/asm/arch-imx8ulp/sys_proto.h
arch/arm/mach-imx/imx8ulp/soc.c
board/freescale/imx8ulp_evk/spl.c

index 8e2c6ed0ceac7d7b7a15e317ff044bc9982cf6a5..284ccafc98855608d69081366f29400da86ebf16 100644 (file)
@@ -17,4 +17,5 @@ int xrdc_config_pdac(u32 bridge, u32 index, u32 dom, u32 perm);
 int xrdc_config_pdac_openacc(u32 bridge, u32 index);
 enum boot_device get_boot_device(void);
 void set_lpav_qos(void);
+void load_lposc_fuse(void);
 #endif
index d9dca21e8c74bdf70e06d8456df2a9a978632484..e12e28d9e7b1e1b3ef2a48344df70df50d6aa15e 100644 (file)
@@ -487,6 +487,26 @@ void lpav_configure(void)
        writel(0x003fffff, SIM_SEC_BASE_ADDR + 0x58);
 }
 
+void load_lposc_fuse(void)
+{
+       int ret;
+       u32 val = 0, val2 = 0, reg;
+
+       ret = fuse_read(25, 0, &val);
+       if (ret)
+               return; /* failed */
+
+       ret = fuse_read(25, 1, &val2);
+       if (ret)
+               return; /* failed */
+
+       /* LPOSCCTRL */
+       reg = readl(0x2802f304);
+       reg &= ~0xff;
+       reg |= (val & 0xff);
+       writel(reg, 0x2802f304);
+}
+
 void set_lpav_qos(void)
 {
        /* Set read QoS of dcnano on LPAV NIC */
index 42f8e262b6a897608647be436f1a084298b5e822..c17d5eff7dc3da729817b54b1f3ebe69b54bc837 100644 (file)
@@ -77,6 +77,12 @@ void spl_board_init(void)
 
        /* After AP set iomuxc0, the i2c can't work, Need M33 to set it now */
 
+       /* Load the lposc fuse for single boot to work around ROM issue,
+        *  The fuse depends on S400 to read.
+        */
+       if (is_soc_rev(CHIP_REV_1_0) && get_boot_mode() == SINGLE_BOOT)
+               load_lposc_fuse();
+
        upower_init();
 
        power_init_board();