diff mbox series

ls1043ardb: nand driver fixups for revision v7.0 boards

Message ID 20220926081849.2990273-1-w.lu@nxp.com
State Awaiting Upstream
Delegated to: Peng Fan
Headers show
Series ls1043ardb: nand driver fixups for revision v7.0 boards | expand

Commit Message

Wei Lu Sept. 26, 2022, 8:18 a.m. UTC
The LS1043ARDB rev v7.0 board replace nand device MT29F4G08ABBDAH4-AITX:D
with MT29F4G08ABBFAH4-AIT:F. Reflecting this change in board_fix_fdt().
CPLD V3.0 is needed for nandboot as the nand device changed.
A new macro CPLD_CFG_RCW_SRC_NAND_4K(4Kpage) is added to distinguish from
CPLD_CFG_RCW_SRC_NAND(2Kpage) to support nandboot on rev v7.0 board.

Signed-off-by: Wei Lu <w.lu@nxp.com>
---
 board/freescale/ls1043ardb/cpld.c       |  4 +++
 board/freescale/ls1043ardb/cpld.h       |  1 +
 board/freescale/ls1043ardb/ls1043ardb.c | 46 ++++++++++++++++++++++++-
 3 files changed, 50 insertions(+), 1 deletion(-)

Comments

Peng Fan (OSS) Oct. 9, 2022, 2:38 a.m. UTC | #1
On 9/26/2022 4:18 PM, Wei Lu wrote:
> The LS1043ARDB rev v7.0 board replace nand device MT29F4G08ABBDAH4-AITX:D
> with MT29F4G08ABBFAH4-AIT:F. Reflecting this change in board_fix_fdt().
> CPLD V3.0 is needed for nandboot as the nand device changed.
> A new macro CPLD_CFG_RCW_SRC_NAND_4K(4Kpage) is added to distinguish from
> CPLD_CFG_RCW_SRC_NAND(2Kpage) to support nandboot on rev v7.0 board.
> 
> Signed-off-by: Wei Lu <w.lu@nxp.com>

Queued in fsl-qoriq/next

Thanks,
Peng.

> ---
>   board/freescale/ls1043ardb/cpld.c       |  4 +++
>   board/freescale/ls1043ardb/cpld.h       |  1 +
>   board/freescale/ls1043ardb/ls1043ardb.c | 46 ++++++++++++++++++++++++-
>   3 files changed, 50 insertions(+), 1 deletion(-)
> 
> diff --git a/board/freescale/ls1043ardb/cpld.c b/board/freescale/ls1043ardb/cpld.c
> index 5d2e8015a0..232035638b 100644
> --- a/board/freescale/ls1043ardb/cpld.c
> +++ b/board/freescale/ls1043ardb/cpld.c
> @@ -69,6 +69,10 @@ void cpld_set_defbank(void)
>   void cpld_set_nand(void)
>   {
>   	u16 reg = CPLD_CFG_RCW_SRC_NAND;
> +
> +	if (CPLD_READ(cpld_ver) > 0x2)
> +		reg = CPLD_CFG_RCW_SRC_NAND_4K;
> +
>   	u8 reg5 = (u8)(reg >> 1);
>   	u8 reg6 = (u8)(reg & 1);
>   
> diff --git a/board/freescale/ls1043ardb/cpld.h b/board/freescale/ls1043ardb/cpld.h
> index 2e757b557f..eed34d6354 100644
> --- a/board/freescale/ls1043ardb/cpld.h
> +++ b/board/freescale/ls1043ardb/cpld.h
> @@ -41,5 +41,6 @@ void cpld_rev_bit(unsigned char *value);
>   #define CPLD_BANK_SEL_ALTBANK	0x04
>   #define CPLD_CFG_RCW_SRC_NOR	0x025
>   #define CPLD_CFG_RCW_SRC_NAND	0x106
> +#define CPLD_CFG_RCW_SRC_NAND_4K	0x118
>   #define CPLD_CFG_RCW_SRC_SD	0x040
>   #endif
> diff --git a/board/freescale/ls1043ardb/ls1043ardb.c b/board/freescale/ls1043ardb/ls1043ardb.c
> index f388eb496f..8c91f0771f 100644
> --- a/board/freescale/ls1043ardb/ls1043ardb.c
> +++ b/board/freescale/ls1043ardb/ls1043ardb.c
> @@ -167,7 +167,7 @@ int checkboard(void)
>   
>   	if (cfg_rcw_src == 0x25)
>   		printf("vBank %d\n", CPLD_READ(vbank));
> -	else if (cfg_rcw_src == 0x106)
> +	else if ((cfg_rcw_src == 0x106) || (cfg_rcw_src == 0x118))
>   		puts("NAND\n");
>   	else
>   		printf("Invalid setting of SW4\n");
> @@ -347,10 +347,54 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>   	return 0;
>   }
>   
> +void nand_fixup(void)
> +{
> +	u32 csor = 0;
> +
> +	if (CPLD_READ(pcba_ver) < 0x7)
> +		return;
> +
> +    /* Change NAND Flash PGS/SPRZ configuration */
> +	csor = CONFIG_SYS_NAND_CSOR;
> +	if ((csor & CSOR_NAND_PGS_MASK) == CSOR_NAND_PGS_2K)
> +		csor = (csor & ~(CSOR_NAND_PGS_MASK)) | CSOR_NAND_PGS_4K;
> +
> +	if ((csor & CSOR_NAND_SPRZ_MASK) == CSOR_NAND_SPRZ_64)
> +		csor = (csor & ~(CSOR_NAND_SPRZ_MASK)) | CSOR_NAND_SPRZ_224;
> +
> +	if (IS_ENABLED(CONFIG_TFABOOT)) {
> +		u8 cfg_rcw_src1, cfg_rcw_src2;
> +		u16 cfg_rcw_src;
> +
> +		cfg_rcw_src1 = CPLD_READ(cfg_rcw_src1);
> +		cfg_rcw_src2 = CPLD_READ(cfg_rcw_src2);
> +		cpld_rev_bit(&cfg_rcw_src1);
> +		cfg_rcw_src = cfg_rcw_src1;
> +		cfg_rcw_src = (cfg_rcw_src << 1) | cfg_rcw_src2;
> +
> +		if (cfg_rcw_src == 0x25)
> +			set_ifc_csor(IFC_CS1, csor);
> +		else if (cfg_rcw_src == 0x118)
> +			set_ifc_csor(IFC_CS0, csor);
> +		else
> +			printf("Invalid setting\n");
> +	} else {
> +		if (IS_ENABLED(CONFIG_NAND_BOOT))
> +			set_ifc_csor(IFC_CS0, csor);
> +		else
> +			set_ifc_csor(IFC_CS1, csor);
> +	}
> +}
> +
>   #if IS_ENABLED(CONFIG_OF_BOARD_FIXUP)
>   int board_fix_fdt(void *blob)
>   {
> +	/* nand driver fix up */
> +	nand_fixup();
> +
> +	/* fdt fix up */
>   	fdt_fixup_phy_addr(blob);
> +
>   	return 0;
>   }
>   #endif
diff mbox series

Patch

diff --git a/board/freescale/ls1043ardb/cpld.c b/board/freescale/ls1043ardb/cpld.c
index 5d2e8015a0..232035638b 100644
--- a/board/freescale/ls1043ardb/cpld.c
+++ b/board/freescale/ls1043ardb/cpld.c
@@ -69,6 +69,10 @@  void cpld_set_defbank(void)
 void cpld_set_nand(void)
 {
 	u16 reg = CPLD_CFG_RCW_SRC_NAND;
+
+	if (CPLD_READ(cpld_ver) > 0x2)
+		reg = CPLD_CFG_RCW_SRC_NAND_4K;
+
 	u8 reg5 = (u8)(reg >> 1);
 	u8 reg6 = (u8)(reg & 1);
 
diff --git a/board/freescale/ls1043ardb/cpld.h b/board/freescale/ls1043ardb/cpld.h
index 2e757b557f..eed34d6354 100644
--- a/board/freescale/ls1043ardb/cpld.h
+++ b/board/freescale/ls1043ardb/cpld.h
@@ -41,5 +41,6 @@  void cpld_rev_bit(unsigned char *value);
 #define CPLD_BANK_SEL_ALTBANK	0x04
 #define CPLD_CFG_RCW_SRC_NOR	0x025
 #define CPLD_CFG_RCW_SRC_NAND	0x106
+#define CPLD_CFG_RCW_SRC_NAND_4K	0x118
 #define CPLD_CFG_RCW_SRC_SD	0x040
 #endif
diff --git a/board/freescale/ls1043ardb/ls1043ardb.c b/board/freescale/ls1043ardb/ls1043ardb.c
index f388eb496f..8c91f0771f 100644
--- a/board/freescale/ls1043ardb/ls1043ardb.c
+++ b/board/freescale/ls1043ardb/ls1043ardb.c
@@ -167,7 +167,7 @@  int checkboard(void)
 
 	if (cfg_rcw_src == 0x25)
 		printf("vBank %d\n", CPLD_READ(vbank));
-	else if (cfg_rcw_src == 0x106)
+	else if ((cfg_rcw_src == 0x106) || (cfg_rcw_src == 0x118))
 		puts("NAND\n");
 	else
 		printf("Invalid setting of SW4\n");
@@ -347,10 +347,54 @@  int ft_board_setup(void *blob, struct bd_info *bd)
 	return 0;
 }
 
+void nand_fixup(void)
+{
+	u32 csor = 0;
+
+	if (CPLD_READ(pcba_ver) < 0x7)
+		return;
+
+    /* Change NAND Flash PGS/SPRZ configuration */
+	csor = CONFIG_SYS_NAND_CSOR;
+	if ((csor & CSOR_NAND_PGS_MASK) == CSOR_NAND_PGS_2K)
+		csor = (csor & ~(CSOR_NAND_PGS_MASK)) | CSOR_NAND_PGS_4K;
+
+	if ((csor & CSOR_NAND_SPRZ_MASK) == CSOR_NAND_SPRZ_64)
+		csor = (csor & ~(CSOR_NAND_SPRZ_MASK)) | CSOR_NAND_SPRZ_224;
+
+	if (IS_ENABLED(CONFIG_TFABOOT)) {
+		u8 cfg_rcw_src1, cfg_rcw_src2;
+		u16 cfg_rcw_src;
+
+		cfg_rcw_src1 = CPLD_READ(cfg_rcw_src1);
+		cfg_rcw_src2 = CPLD_READ(cfg_rcw_src2);
+		cpld_rev_bit(&cfg_rcw_src1);
+		cfg_rcw_src = cfg_rcw_src1;
+		cfg_rcw_src = (cfg_rcw_src << 1) | cfg_rcw_src2;
+
+		if (cfg_rcw_src == 0x25)
+			set_ifc_csor(IFC_CS1, csor);
+		else if (cfg_rcw_src == 0x118)
+			set_ifc_csor(IFC_CS0, csor);
+		else
+			printf("Invalid setting\n");
+	} else {
+		if (IS_ENABLED(CONFIG_NAND_BOOT))
+			set_ifc_csor(IFC_CS0, csor);
+		else
+			set_ifc_csor(IFC_CS1, csor);
+	}
+}
+
 #if IS_ENABLED(CONFIG_OF_BOARD_FIXUP)
 int board_fix_fdt(void *blob)
 {
+	/* nand driver fix up */
+	nand_fixup();
+
+	/* fdt fix up */
 	fdt_fixup_phy_addr(blob);
+
 	return 0;
 }
 #endif