summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilippe Schenker <philippe.schenker@toradex.com>2020-03-10 17:54:18 +0100
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2020-03-13 11:01:00 +0100
commitff527ebcd2ea15f0cbb3d1eb9ba953e3bfefb3c7 (patch)
tree9b112699f460362c650024bfb4e888411b3095cb
parenta960b9ecd99d1b4e3f194bc52d92cb41b0d80e4a (diff)
apalis-imx8: Implement hardware version detection
And select the correct devicetree to load. Related-to: ELB-1254 Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
-rw-r--r--board/toradex/apalis-imx8/apalis-imx8.c79
-rw-r--r--include/configs/apalis-imx8.h3
2 files changed, 81 insertions, 1 deletions
diff --git a/board/toradex/apalis-imx8/apalis-imx8.c b/board/toradex/apalis-imx8/apalis-imx8.c
index 9d8da5bc5e..8bc656dd31 100644
--- a/board/toradex/apalis-imx8/apalis-imx8.c
+++ b/board/toradex/apalis-imx8/apalis-imx8.c
@@ -43,6 +43,27 @@ DECLARE_GLOBAL_DATA_PTR;
#define UART_PAD_CTRL ((SC_PAD_CONFIG_OUT_IN << PADRING_CONFIG_SHIFT) | (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) \
| (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+#define PCB_VERS_DETECT ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT) | (SC_PAD_28FDSOI_PS_PU << PADRING_PULL_SHIFT))
+
+#define PCB_VERS_DEFAULT ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | (SC_PAD_ISO_OFF << PADRING_LPCONFIG_SHIFT) | \
+ (SC_PAD_28FDSOI_PS_PD << PADRING_PULL_SHIFT) | (SC_PAD_28FDSOI_DSE_DV_HIGH << PADRING_DSE_SHIFT))
+
+typedef enum {
+ PCB_VERSION_1_0,
+ PCB_VERSION_1_1
+} pcb_rev_t;
+
+static iomux_cfg_t pcb_vers_detect[] = {
+ SC_P_MIPI_DSI0_GPIO0_00 | MUX_MODE_ALT(3) | MUX_PAD_CTRL(PCB_VERS_DETECT),
+ SC_P_MIPI_DSI0_GPIO0_01 | MUX_MODE_ALT(3) | MUX_PAD_CTRL(PCB_VERS_DETECT),
+};
+
+static iomux_cfg_t pcb_vers_default[] = {
+ SC_P_MIPI_DSI0_GPIO0_00 | MUX_MODE_ALT(3) | MUX_PAD_CTRL(PCB_VERS_DEFAULT),
+ SC_P_MIPI_DSI0_GPIO0_01 | MUX_MODE_ALT(3) | MUX_PAD_CTRL(PCB_VERS_DEFAULT),
+};
+
static iomux_cfg_t uart1_pads[] = {
SC_P_UART1_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
SC_P_UART1_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
@@ -278,6 +299,62 @@ void board_late_mmc_env_init(void)
run_command(cmd, 0);
}
+static pcb_rev_t get_pcb_revision(void)
+{
+ unsigned int pcb_vers = 0;
+
+ imx8_iomux_setup_multiple_pads(pcb_vers_detect,
+ ARRAY_SIZE(pcb_vers_detect));
+
+ gpio_request(IMX_GPIO_NR(1, 18), \
+ "PCB version detection on PAD SC_P_MIPI_DSI0_GPIO0_00");
+ gpio_request(IMX_GPIO_NR(1, 19), \
+ "PCB version detection on PAD SC_P_MIPI_DSI0_GPIO0_01");
+ gpio_direction_input(IMX_GPIO_NR(1, 18));
+ gpio_direction_input(IMX_GPIO_NR(1, 19));
+
+ udelay(1000);
+
+ pcb_vers = gpio_get_value(IMX_GPIO_NR(1, 18));
+ pcb_vers |= gpio_get_value(IMX_GPIO_NR(1, 19)) << 1;
+
+ /* Set muxing back to default values for saving energy */
+ imx8_iomux_setup_multiple_pads(pcb_vers_default,
+ ARRAY_SIZE(pcb_vers_default));
+
+ switch(pcb_vers) {
+ case 0b11:
+ return PCB_VERSION_1_0;
+ break;
+ case 0b10:
+ return PCB_VERSION_1_1;
+ break;
+ default:
+ return -ENODEV;
+ break;
+ }
+}
+
+static int select_dt_from_module_version(void)
+{
+ char *fdt_env = env_get("fdtfile");
+
+ switch(get_pcb_revision()) {
+ case PCB_VERSION_1_0:
+ if (strcmp(FDT_FILE_V1_0, fdt_env)) {
+ env_set("fdtfile", FDT_FILE_V1_0);
+ printf("Detected a V1.0 module, setting " \
+ "correct devicetree\n");
+#ifndef CONFIG_ENV_IS_NOWHERE
+ env_save();
+#endif
+ }
+ break;
+ default:
+ break;
+ }
+}
+
int board_late_init(void)
{
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
@@ -314,6 +391,8 @@ int board_late_init(void)
run_command(command, 0);
#endif
+ select_dt_from_module_version();
+
return 0;
}
diff --git a/include/configs/apalis-imx8.h b/include/configs/apalis-imx8.h
index c29a34d90d..4a337a9440 100644
--- a/include/configs/apalis-imx8.h
+++ b/include/configs/apalis-imx8.h
@@ -104,7 +104,8 @@
#define CONFIG_SKIP_RESOURCE_CHECING
-#define FDT_FILE "fsl-imx8qm-apalis-eval.dtb"
+#define FDT_FILE "fsl-imx8qm-apalis-v1.1-eval.dtb"
+#define FDT_FILE_V1_0 "fsl-imx8qm-apalis-eval.dtb"
/* Initial environment variables */
#define CONFIG_EXTRA_ENV_SETTINGS \