board: fsl: lx2160a: implement board_fix_fdt
authorPankaj Bansal <pankaj.bansal@nxp.com>
Sat, 17 Aug 2019 01:07:32 +0000 (01:07 +0000)
committerPriyanka Jain <priyanka.jain@nxp.com>
Thu, 12 Sep 2019 10:45:42 +0000 (16:15 +0530)
lx2160a rev1 and rev2 SoC has different pcie controller.
The pcie controller device tree node fields "compatible"
and registers names needs to be updated accordingly

This change in device tree is handled as part of
fdt fixups. These changes would only be applied
if the soc revision is not rev1.

Signed-off-by: Pankaj Bansal <pankaj.bansal@nxp.com>
Signed-off-by: Priyanka Jain <priyanka.jain@nxp.com>
board/freescale/lx2160a/lx2160a.c
configs/lx2160aqds_tfa_defconfig
configs/lx2160ardb_tfa_defconfig

index 7f19a1a1458dcfa4dc1ed5d2a18cfc07407528d8..2a8dbca58483de937dc358cb5f4a9066a8b8c2c9 100644 (file)
@@ -20,6 +20,8 @@
 #include <efi_loader.h>
 #include <asm/arch/mmu.h>
 #include <hwconfig.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/config.h>
 #include <asm/arch/fsl_serdes.h>
 #include <asm/arch/soc.h>
 #include "../common/qixis.h"
@@ -116,6 +118,72 @@ int board_early_init_f(void)
        return 0;
 }
 
+#ifdef CONFIG_OF_BOARD_FIXUP
+int board_fix_fdt(void *fdt)
+{
+       char *reg_names, *reg_name;
+       int names_len, old_name_len, new_name_len, remaining_names_len;
+       struct str_map {
+               char *old_str;
+               char *new_str;
+       } reg_names_map[] = {
+               { "ccsr", "dip" },
+               { "pf_ctrl", "ctrl" }
+       };
+       int off = -1, i;
+
+       if (IS_SVR_REV(get_svr(), 1, 0))
+               return 0;
+
+       off = fdt_node_offset_by_compatible(fdt, -1, "fsl,lx2160a-pcie");
+       while (off != -FDT_ERR_NOTFOUND) {
+               fdt_setprop(fdt, off, "compatible", "fsl,ls-pcie",
+                           strlen("fsl,ls-pcie") + 1);
+
+               reg_names = (char *)fdt_getprop(fdt, off, "reg-names",
+                                               &names_len);
+               if (!reg_names)
+                       continue;
+
+               reg_name = reg_names;
+               remaining_names_len = names_len - (reg_name - reg_names);
+               for (i = 0; (i < ARRAY_SIZE(reg_names_map)) && names_len; i++) {
+                       old_name_len = strlen(reg_names_map[i].old_str);
+                       new_name_len = strlen(reg_names_map[i].new_str);
+                       if (memcmp(reg_name, reg_names_map[i].old_str,
+                                  old_name_len) == 0) {
+                               /* first only leave required bytes for new_str
+                                * and copy rest of the string after it
+                                */
+                               memcpy(reg_name + new_name_len,
+                                      reg_name + old_name_len,
+                                      remaining_names_len - old_name_len);
+                               /* Now copy new_str */
+                               memcpy(reg_name, reg_names_map[i].new_str,
+                                      new_name_len);
+                               names_len -= old_name_len;
+                               names_len += new_name_len;
+                       }
+
+                       reg_name = memchr(reg_name, '\0', remaining_names_len);
+                       if (!reg_name)
+                               break;
+
+                       reg_name += 1;
+
+                       remaining_names_len = names_len -
+                                             (reg_name - reg_names);
+               }
+
+               fdt_setprop(fdt, off, "reg-names", reg_names, names_len);
+               off = fdt_node_offset_by_compatible(fdt, off,
+                                                   "fsl,lx2160a-pcie");
+       }
+
+       return 0;
+}
+#endif
+
 #if defined(CONFIG_TARGET_LX2160AQDS)
 void esdhc_dspi_status_fixup(void *blob)
 {
index 4e85543649c7780a40c66370bbbb4ede66b762e7..e38c2a1e9fff07f2aaceb7cbc6c8f91d6f3040dd 100644 (file)
@@ -9,6 +9,7 @@ CONFIG_SEC_FIRMWARE_ARMV8_PSCI=y
 CONFIG_AHCI=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_BOARD_FIXUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_BOOTDELAY=10
 CONFIG_USE_BOOTARGS=y
index f08b3f4bf96c2f099c9865719b07d428bfe0224d..6d14b6f9ecd451be7119d89a1086b521b9e1675c 100644 (file)
@@ -10,6 +10,7 @@ CONFIG_SEC_FIRMWARE_ARMV8_PSCI=y
 CONFIG_AHCI=y
 CONFIG_FIT_VERBOSE=y
 CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_BOARD_FIXUP=y
 CONFIG_OF_STDOUT_VIA_ALIAS=y
 CONFIG_BOOTDELAY=10
 CONFIG_USE_BOOTARGS=y