Commit d4a8de1a authored by Thomas Schäfer's avatar Thomas Schäfer
Browse files

pitx-imx8m: add detection of hw revision



- read brd_rev gpio lines to determine board hardware revision
- create human readable environment variable 'hw_rev'
Signed-off-by: Thomas Schäfer's avatarThomas Schaefer <thomas.schaefer@kontron.com>
parent 0baf7db9
......@@ -43,6 +43,17 @@ extern int EMB_EEP_I2C_EEPROM_BUS_NUM_1;
DECLARE_GLOBAL_DATA_PTR;
static const char *hw_variants[8] = {
"unknown",
"unknown",
"unknown",
"L130",
"L140",
"L150",
"L160",
"L120"
};
#define QSPI_PAD_CTRL (PAD_CTL_DSE2 | PAD_CTL_HYS)
#define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
......@@ -386,6 +397,73 @@ uint64_t getBootCounter (int eeprom_num)
}
#endif // CONFIG_CMD_KBOARDINFO
static int get_hw_rev(void)
{
return ((gpio_get_value(IMX_GPIO_NR(5,0)) |
gpio_get_value(IMX_GPIO_NR(5,1)) << 1 |
gpio_get_value(IMX_GPIO_NR(5,2)) << 2 ) & 0x7 );
}
#define BRD_REV_PAD_CTRL (PAD_CTL_PUE | PAD_CTL_FSEL2 | PAD_CTL_DSE7)
static iomux_v3_cfg_t const gpio_pads[] = {
IMX8MQ_PAD_NAND_CLE__GPIO3_IO5 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_RE_B__GPIO3_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_WE_B__GPIO3_IO17 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_WP_B__GPIO3_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_READY_B__GPIO3_IO16 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_DATA04__GPIO3_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_DATA05__GPIO3_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_DATA06__GPIO3_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_ECSPI1_SCLK__GPIO5_IO6 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_SAI5_RXC__GPIO3_IO20 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_GPIO1_IO05__GPIO1_IO5 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_GPIO1_IO10__GPIO1_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_SAI3_TXC__GPIO5_IO0 | MUX_PAD_CTRL(BRD_REV_PAD_CTRL),
IMX8MQ_PAD_SAI3_TXD__GPIO5_IO1 | MUX_PAD_CTRL(BRD_REV_PAD_CTRL),
IMX8MQ_PAD_SAI3_MCLK__GPIO5_IO2 | MUX_PAD_CTRL(BRD_REV_PAD_CTRL),
};
int board_gpio_init(void)
{
imx_iomux_v3_setup_multiple_pads(gpio_pads, ARRAY_SIZE(gpio_pads));
gpio_request(IMX_GPIO_NR(3, 5), "GPIO0");
gpio_direction_output(IMX_GPIO_NR(3, 5), 0); /*GPIO0*/
gpio_request(IMX_GPIO_NR(3, 15), "GPIO1");
gpio_direction_output(IMX_GPIO_NR(3, 15), 0); /*GPIO1*/
gpio_request(IMX_GPIO_NR(3, 17), "GPIO2");
gpio_direction_output(IMX_GPIO_NR(3, 17), 0); /*GPIO2*/
gpio_request(IMX_GPIO_NR(3, 18), "GPIO3");
gpio_direction_output(IMX_GPIO_NR(3, 18), 0); /*GPIO3*/
gpio_request(IMX_GPIO_NR(3, 16), "GPIO4");
gpio_direction_output(IMX_GPIO_NR(3, 16), 0); /*GPIO4*/
gpio_request(IMX_GPIO_NR(3, 10), "GPIO5");
gpio_direction_output(IMX_GPIO_NR(3, 10), 0); /*GPIO5*/
gpio_request(IMX_GPIO_NR(3, 11), "GPIO6");
gpio_direction_output(IMX_GPIO_NR(3, 11), 0); /*GPIO6*/
gpio_request(IMX_GPIO_NR(3, 12), "GPIO7");
gpio_direction_output(IMX_GPIO_NR(3, 12), 0); /*GPIO7*/
gpio_request(IMX_GPIO_NR(5, 6), "LVDS_VDD_EN");
gpio_direction_output(IMX_GPIO_NR(5, 6), 1); /*LVDS_VDD_EN*/
gpio_request(IMX_GPIO_NR(3, 20), "DSI_RST#");
gpio_direction_output(IMX_GPIO_NR(3, 20), 0); /*DSI_RST#*/
gpio_request(IMX_GPIO_NR(1, 5), "CAM_RST#");
gpio_direction_output(IMX_GPIO_NR(1, 5), 1); /*CAM0_RST#*/
gpio_request(IMX_GPIO_NR(1, 10), "GBE0_PWDN#");
gpio_direction_output(IMX_GPIO_NR(1, 10), 1); /*GBE0_PWDN*/
gpio_request(IMX_GPIO_NR(5, 0), "BRD_REV0");
gpio_direction_input(IMX_GPIO_NR(5, 0)); /* BRD_REV[0] */
gpio_request(IMX_GPIO_NR(5, 1), "BRD_REV1");
gpio_direction_input(IMX_GPIO_NR(5, 1)); /* BRD_REV[1] */
gpio_request(IMX_GPIO_NR(5, 2), "BRD_REV2");
gpio_direction_input(IMX_GPIO_NR(5, 2)); /* BRD_REV[2] */
return 0;
}
int board_init(void)
{
board_qspi_init();
......@@ -401,6 +479,7 @@ int board_init(void)
#ifdef CONFIG_USB_TCPC
setup_typec();
#endif
return 0;
}
......@@ -409,19 +488,6 @@ int board_mmc_get_env_dev(int devno)
return devno;
}
static iomux_v3_cfg_t const gpio_pads[] = {
IMX8MQ_PAD_NAND_CLE__GPIO3_IO5 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_RE_B__GPIO3_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_WE_B__GPIO3_IO17 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_WP_B__GPIO3_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_READY_B__GPIO3_IO16 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_DATA04__GPIO3_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_DATA05__GPIO3_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_NAND_DATA06__GPIO3_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_GPIO1_IO05__GPIO1_IO5 | MUX_PAD_CTRL(NO_PAD_CTRL),
IMX8MQ_PAD_GPIO1_IO10__GPIO1_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
};
#define TPM_RESET IMX_GPIO_NR(3, 2)
#define USBHUB_RESET IMX_GPIO_NR(3, 4)
......@@ -437,33 +503,7 @@ int misc_init_r(void)
/*emb_eep_init_r (1, 1, 2); */ /* import 2 MAC address, will try it once the ETH1 UP */
#endif
imx_iomux_v3_setup_multiple_pads(gpio_pads, ARRAY_SIZE(gpio_pads));
gpio_request(IMX_GPIO_NR(3, 5), "GPIO0");
gpio_direction_output(IMX_GPIO_NR(3,5), 0); /*GPIO0*/
gpio_request(IMX_GPIO_NR(3, 15), "GPIO1");
gpio_direction_output(IMX_GPIO_NR(3,15), 0); /*GPIO1*/
gpio_request(IMX_GPIO_NR(3, 17), "GPIO2");
gpio_direction_output(IMX_GPIO_NR(3,17), 0); /*GPIO2*/
gpio_request(IMX_GPIO_NR(3, 18), "GPIO3");
gpio_direction_output(IMX_GPIO_NR(3,18), 0); /*GPIO3*/
gpio_request(IMX_GPIO_NR(3, 16), "GPIO4");
gpio_direction_output(IMX_GPIO_NR(3,16), 0); /*GPIO4*/
gpio_request(IMX_GPIO_NR(3, 10), "GPIO5");
gpio_direction_output(IMX_GPIO_NR(3,10), 0); /*GPIO5*/
gpio_request(IMX_GPIO_NR(3, 11), "GPIO6");
gpio_direction_output(IMX_GPIO_NR(3,11), 0); /*GPIO6*/
gpio_request(IMX_GPIO_NR(3, 12), "GPIO7");
gpio_direction_output(IMX_GPIO_NR(3,12), 0); /*GPIO7*/
gpio_request(IMX_GPIO_NR(5, 6), "LVDS_VDD_EN");
gpio_direction_output(IMX_GPIO_NR(5, 6), 1); /*LVDS_VDD_EN*/
gpio_request(IMX_GPIO_NR(3, 20), "DSI_RST#");
gpio_direction_output(IMX_GPIO_NR(3, 20), 0); /*DSI_RST#*/
gpio_request(IMX_GPIO_NR(1, 5), "CAM_RST#");
gpio_direction_output(IMX_GPIO_NR(1,5), 1); /*CAM0_RST#*/
gpio_request(IMX_GPIO_NR(1, 10), "GBE0_PWDN#");
gpio_direction_output(IMX_GPIO_NR(1,10), 1); /*GBE0_PWDN*/
board_gpio_init();
/*
* reset TPM chip (Infineon SLB9670) as required by datasheet
......@@ -483,6 +523,8 @@ int misc_init_r(void)
udelay(10000);
gpio_direction_output(USBHUB_RESET, 1);
board_gpio_init();
return 0;
}
......@@ -517,6 +559,8 @@ static enum boot_source pitx_imx8m_boot_source(void)
int board_late_init(void)
{
int hw_rev = get_hw_rev();
env_set("hw_rev", hw_variants[hw_rev]);
env_set_ulong("bootsource", pitx_imx8m_boot_source());
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
env_set("board_name", "PITX-iMX8M");
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment