imx: ventana: move wdog/uhs-i board/revision dt fixups
authorTim Harvey <tharvey@gateworks.com>
Sat, 24 Jul 2021 17:40:32 +0000 (10:40 -0700)
committerStefano Babic <sbabic@denx.de>
Mon, 9 Aug 2021 12:46:50 +0000 (14:46 +0200)
Move board/revision specific dt fixups for WDOG and UHS-I features
so that we can call them early for U-Boot control dt as well.

Additionally drop a deprected non-mainline dt-prop fixup regarding
HDMI input format.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
board/gateworks/gw_ventana/common.c
board/gateworks/gw_ventana/common.h
board/gateworks/gw_ventana/gw_ventana.c
board/gateworks/gw_ventana/gw_ventana_spl.c

index 4a15837..e9b7357 100644 (file)
@@ -1697,6 +1697,137 @@ void setup_pmic(void)
        }
 }
 
+#include <fdt_support.h>
+#define WDOG1_ADDR      0x20bc000
+#define WDOG2_ADDR      0x20c0000
+#define GPIO3_ADDR      0x20a4000
+#define USDHC3_ADDR     0x2198000
+
+static void ft_board_wdog_fixup(void *blob, phys_addr_t addr)
+{
+       int off = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt", addr);
+
+       if (off) {
+               fdt_delprop(blob, off, "ext-reset-output");
+               fdt_delprop(blob, off, "fsl,ext-reset-output");
+       }
+}
+
+void ft_early_fixup(void *blob, int board_type)
+{
+       struct ventana_board_info *info = &ventana_info;
+       char rev = 0;
+       int i;
+
+       /* determine board revision */
+       for (i = sizeof(ventana_info.model) - 1; i > 0; i--) {
+               if (ventana_info.model[i] >= 'A') {
+                       rev = ventana_info.model[i];
+                       break;
+               }
+       }
+
+       /*
+        * Board model specific fixups
+        */
+       switch (board_type) {
+       case GW51xx:
+               /*
+                * disable wdog node for GW51xx-A/B to work around
+                * errata causing wdog timer to be unreliable.
+                */
+               if (rev >= 'A' && rev < 'C') {
+                       i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt",
+                                                         WDOG1_ADDR);
+                       if (i)
+                               fdt_status_disabled(blob, i);
+               }
+
+               /* GW51xx-E adds WDOG1_B external reset */
+               if (rev < 'E')
+                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
+               break;
+
+       case GW52xx:
+               /* GW522x Uses GPIO3_IO23 instead of GPIO1_IO29 */
+               if (info->model[4] == '2') {
+                       u32 handle = 0;
+                       u32 *range = NULL;
+
+                       i = fdt_node_offset_by_compatible(blob, -1,
+                                                         "fsl,imx6q-pcie");
+                       if (i)
+                               range = (u32 *)fdt_getprop(blob, i,
+                                                          "reset-gpio", NULL);
+
+                       if (range) {
+                               i = fdt_node_offset_by_compat_reg(blob,
+                                       "fsl,imx6q-gpio", GPIO3_ADDR);
+                               if (i)
+                                       handle = fdt_get_phandle(blob, i);
+                               if (handle) {
+                                       range[0] = cpu_to_fdt32(handle);
+                                       range[1] = cpu_to_fdt32(23);
+                               }
+                       }
+
+                       /* these have broken usd_vsel */
+                       if (strstr((const char *)info->model, "SP318-B") ||
+                           strstr((const char *)info->model, "SP331-B"))
+                               gpio_cfg[board_type].usd_vsel = 0;
+
+                       /* GW522x-B adds WDOG1_B external reset */
+                       if (rev < 'B')
+                               ft_board_wdog_fixup(blob, WDOG1_ADDR);
+               }
+
+               /* GW520x-E adds WDOG1_B external reset */
+               else if (info->model[4] == '0' && rev < 'E')
+                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
+               break;
+
+       case GW53xx:
+               /* GW53xx-E adds WDOG1_B external reset */
+               if (rev < 'E')
+                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
+               break;
+
+       case GW54xx:
+               /*
+                * disable serial2 node for GW54xx for compatibility with older
+                * 3.10.x kernel that improperly had this node enabled in the DT
+                */
+               fdt_set_status_by_alias(blob, "serial2", FDT_STATUS_DISABLED,
+                                       0);
+
+               /* GW54xx-E adds WDOG2_B external reset */
+               if (rev < 'E')
+                       ft_board_wdog_fixup(blob, WDOG2_ADDR);
+               break;
+
+       case GW551x:
+               /* GW551x-C adds WDOG1_B external reset */
+               if (rev < 'C')
+                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
+               break;
+       case GW5901:
+       case GW5902:
+               /* GW5901/GW5901 revB adds WDOG1_B as an external reset */
+               if (rev < 'B')
+                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
+               break;
+       }
+
+       /* remove no-1-8-v if UHS-I support is present */
+       if (gpio_cfg[board_type].usd_vsel) {
+               debug("Enabling UHS-I support\n");
+               i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-usdhc",
+                                                 USDHC3_ADDR);
+               if (i)
+                       fdt_delprop(blob, i, "no-1-8-v");
+       }
+}
+
 #ifdef CONFIG_FSL_ESDHC_IMX
 static struct fsl_esdhc_cfg usdhc_cfg[2];
 
index 813f7d9..8f226d1 100644 (file)
@@ -93,5 +93,7 @@ void setup_pmic(void);
 void setup_iomux_gpio(int board, struct ventana_board_info *);
 /* late setup of GPIO (configuration per baseboard and env) */
 void setup_board_gpio(int board, struct ventana_board_info *);
+/* early model/revision ft fixups */
+void ft_early_fixup(void *fdt, int board_type);
 
 #endif /* #ifndef _GWVENTANA_COMMON_H_ */
index e2dd6dc..7e0122c 100644 (file)
@@ -967,16 +967,6 @@ void ft_board_pci_fixup(void *blob, struct bd_info *bd)
 }
 #endif /* if defined(CONFIG_CMD_PCI) */
 
-void ft_board_wdog_fixup(void *blob, phys_addr_t addr)
-{
-       int off = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt", addr);
-
-       if (off) {
-               fdt_delprop(blob, off, "ext-reset-output");
-               fdt_delprop(blob, off, "fsl,ext-reset-output");
-       }
-}
-
 /*
  * called prior to booting kernel or by 'fdt boardsetup' command
  *
@@ -986,10 +976,6 @@ void ft_board_wdog_fixup(void *blob, phys_addr_t addr)
  *  - board (full model from EEPROM)
  *  - peripherals removed from DTB if not loaded on board (per EEPROM config)
  */
-#define WDOG1_ADDR     0x20bc000
-#define WDOG2_ADDR     0x20c0000
-#define GPIO3_ADDR     0x20a4000
-#define USDHC3_ADDR    0x2198000
 #define PWM0_ADDR      0x2080000
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
@@ -1043,139 +1029,8 @@ int ft_board_setup(void *blob, struct bd_info *bd)
        /* set desired digital video capture format */
        ft_sethdmiinfmt(blob, env_get("hdmiinfmt"));
 
-       /*
-        * Board model specific fixups
-        */
-       switch (board_type) {
-       case GW51xx:
-               /*
-                * disable wdog node for GW51xx-A/B to work around
-                * errata causing wdog timer to be unreliable.
-                */
-               if (rev >= 'A' && rev < 'C') {
-                       i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-wdt",
-                                                         WDOG1_ADDR);
-                       if (i)
-                               fdt_status_disabled(blob, i);
-               }
-
-               /* GW51xx-E adds WDOG1_B external reset */
-               if (rev < 'E')
-                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
-               break;
-
-       case GW52xx:
-               /* GW522x Uses GPIO3_IO23 instead of GPIO1_IO29 */
-               if (info->model[4] == '2') {
-                       u32 handle = 0;
-                       u32 *range = NULL;
-
-                       i = fdt_node_offset_by_compatible(blob, -1,
-                                                         "fsl,imx6q-pcie");
-                       if (i)
-                               range = (u32 *)fdt_getprop(blob, i,
-                                                          "reset-gpio", NULL);
-
-                       if (range) {
-                               i = fdt_node_offset_by_compat_reg(blob,
-                                       "fsl,imx6q-gpio", GPIO3_ADDR);
-                               if (i)
-                                       handle = fdt_get_phandle(blob, i);
-                               if (handle) {
-                                       range[0] = cpu_to_fdt32(handle);
-                                       range[1] = cpu_to_fdt32(23);
-                               }
-                       }
-
-                       /* these have broken usd_vsel */
-                       if (strstr((const char *)info->model, "SP318-B") ||
-                           strstr((const char *)info->model, "SP331-B"))
-                               gpio_cfg[board_type].usd_vsel = 0;
-
-                       /* GW522x-B adds WDOG1_B external reset */
-                       if (rev < 'B')
-                               ft_board_wdog_fixup(blob, WDOG1_ADDR);
-               }
-
-               /* GW520x-E adds WDOG1_B external reset */
-               else if (info->model[4] == '0' && rev < 'E')
-                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
-               break;
-
-       case GW53xx:
-               /* GW53xx-E adds WDOG1_B external reset */
-               if (rev < 'E')
-                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
-               break;
-
-       case GW54xx:
-               /*
-                * disable serial2 node for GW54xx for compatibility with older
-                * 3.10.x kernel that improperly had this node enabled in the DT
-                */
-               fdt_set_status_by_alias(blob, "serial2", FDT_STATUS_DISABLED,
-                                       0);
-
-               /* GW54xx-E adds WDOG2_B external reset */
-               if (rev < 'E')
-                       ft_board_wdog_fixup(blob, WDOG2_ADDR);
-               break;
-
-       case GW551x:
-               /*
-                * isolate CSI0_DATA_EN for GW551x-A to work around errata
-                * causing non functional digital video in (it is not hooked up)
-                */
-               if (rev == 'A') {
-                       u32 *range = NULL;
-                       int len;
-                       const u32 *handle = NULL;
-
-                       i = fdt_node_offset_by_compatible(blob, -1,
-                                               "fsl,imx-tda1997x-video");
-                       if (i)
-                               handle = fdt_getprop(blob, i, "pinctrl-0",
-                                                    NULL);
-                       if (handle)
-                               i = fdt_node_offset_by_phandle(blob,
-                                                       fdt32_to_cpu(*handle));
-                       if (i)
-                               range = (u32 *)fdt_getprop(blob, i, "fsl,pins",
-                                                          &len);
-                       if (range) {
-                               len /= sizeof(u32);
-                               for (i = 0; i < len; i += 6) {
-                                       u32 mux_reg = fdt32_to_cpu(range[i+0]);
-                                       u32 conf_reg = fdt32_to_cpu(range[i+1]);
-                                       /* mux PAD_CSI0_DATA_EN to GPIO */
-                                       if (is_cpu_type(MXC_CPU_MX6Q) &&
-                                           mux_reg == 0x260 &&
-                                           conf_reg == 0x630)
-                                               range[i+3] = cpu_to_fdt32(0x5);
-                                       else if (!is_cpu_type(MXC_CPU_MX6Q) &&
-                                                mux_reg == 0x08c &&
-                                                conf_reg == 0x3a0)
-                                               range[i+3] = cpu_to_fdt32(0x5);
-                               }
-                               fdt_setprop_inplace(blob, i, "fsl,pins", range,
-                                                   len);
-                       }
-
-                       /* set BT656 video format */
-                       ft_sethdmiinfmt(blob, "yuv422bt656");
-               }
-
-               /* GW551x-C adds WDOG1_B external reset */
-               if (rev < 'C')
-                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
-               break;
-       case GW5901:
-       case GW5902:
-               /* GW5901/GW5901 revB adds WDOG1_B as an external reset */
-               if (rev < 'B')
-                       ft_board_wdog_fixup(blob, WDOG1_ADDR);
-               break;
-       }
+       /* early board/revision ft fixups */
+       ft_early_fixup(blob, board_type);
 
        /* Configure DIO */
        for (i = 0; i < gpio_cfg[board_type].dio_num; i++) {
@@ -1201,15 +1056,6 @@ int ft_board_setup(void *blob, struct bd_info *bd)
                }
        }
 
-       /* remove no-1-8-v if UHS-I support is present */
-       if (gpio_cfg[board_type].usd_vsel) {
-               debug("Enabling UHS-I support\n");
-               i = fdt_node_offset_by_compat_reg(blob, "fsl,imx6q-usdhc",
-                                                 USDHC3_ADDR);
-               if (i)
-                       fdt_delprop(blob, i, "no-1-8-v");
-       }
-
 #if defined(CONFIG_CMD_PCI)
        if (!env_get("nopcifixup"))
                ft_board_pci_fixup(blob, bd);
index a4f6439..5a69aff 100644 (file)
@@ -729,10 +729,10 @@ void board_boot_order(u32 *spl_boot_list)
 
 /* called from board_init_r after gd setup if CONFIG_SPL_BOARD_INIT defined */
 /* its our chance to print info about boot device */
+static int board_type;
 void spl_board_init(void)
 {
        u32 boot_device;
-       int board_type;
 
        /* determine boot device from SRC_SBMR1 (BOOT_CFG[4:1]) or SRC_GPR9 */
        boot_device = spl_boot_device();
@@ -785,3 +785,8 @@ int spl_start_uboot(void)
        return ret;
 }
 #endif
+
+void spl_perform_fixups(struct spl_image_info *spl_image)
+{
+       ft_early_fixup(spl_image->fdt_addr, board_type);
+}