From 41b3b1e36658cc9d3a473e736a1e5559e6e62fd7 Mon Sep 17 00:00:00 2001 From: Max Krummenacher Date: Wed, 14 Oct 2020 19:47:44 +0200 Subject: verdin-imx8mm: implement hardware version detection And select the correct devicetree accordingly by setting the variant environment variable. Related-to: ELB-3138 Signed-off-by: Max Krummenacher --- board/toradex/verdin-imx8mm/verdin-imx8mm.c | 63 ++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/board/toradex/verdin-imx8mm/verdin-imx8mm.c b/board/toradex/verdin-imx8mm/verdin-imx8mm.c index 95fd1a2999..abb4079087 100644 --- a/board/toradex/verdin-imx8mm/verdin-imx8mm.c +++ b/board/toradex/verdin-imx8mm/verdin-imx8mm.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -31,9 +32,16 @@ DECLARE_GLOBAL_DATA_PTR; +#define I2C_PMIC 0 + #define UART_PAD_CTRL (PAD_CTL_PUE | PAD_CTL_PE | PAD_CTL_DSE4) #define WDOG_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE) +typedef enum { + PCB_VERSION_1_0, + PCB_VERSION_1_1 +} pcb_rev_t; + /* Verdin UART_3, Console/Debug UART */ static iomux_v3_cfg_t const uart_pads[] = { IMX8MM_PAD_SAI2_RXFS_UART1_TX | MUX_PAD_CTRL(UART_PAD_CTRL), @@ -507,19 +515,64 @@ struct display_info_t const displays[] = {{ size_t display_count = ARRAY_SIZE(displays); #endif /* CONFIG_VIDEO_MXS */ -int board_late_init(void) +static pcb_rev_t get_pcb_revision(void) { + struct udevice *bus; + struct udevice *i2c_dev = NULL; + int ret; + uint8_t is_bd71837 = 0; + + ret = uclass_get_device_by_seq(UCLASS_I2C, I2C_PMIC, &bus); + if (!ret) + ret = dm_i2c_probe(bus, 0x4b, 0, &i2c_dev); + if (!ret) + ret = dm_i2c_read(i2c_dev, 0x0, &is_bd71837, 1); + + /* BD71837_REV, High Nibble is major version, fix 1010 */ + is_bd71837 = !ret && ((is_bd71837 & 0xf0) == 0xa0); + return is_bd71837 ? PCB_VERSION_1_0 : PCB_VERSION_1_1; +} + +static void select_dt_from_module_version(void) +{ + char variant[32]; + int is_wifi = 0; + #ifdef CONFIG_TDX_CFG_BLOCK /* * If we have a valid config block and it says we are a module with * Wi-Fi/Bluetooth make sure we use the -wifi device tree. */ - if (tdx_hw_tag.prodid == VERDIN_IMX8MMQ_WIFI_BT_IT) - env_set("variant", "wifi"); - else - env_set("variant", "nonwifi"); + is_wifi = tdx_hw_tag.prodid == VERDIN_IMX8MMQ_WIFI_BT_IT; #endif + switch(get_pcb_revision()) { + case PCB_VERSION_1_0: + printf("Detected a V1.0 module\n"); + if (is_wifi) + strncpy(&variant[0], "wifi", sizeof(variant)); + else + strncpy(&variant[0], "nonwifi", sizeof(variant)); + break; + default: + if (is_wifi) + strncpy(&variant[0], "wifi-v1.1", sizeof(variant)); + else + strncpy(&variant[0], "nonwifi-v1.1", sizeof(variant)); + break; + } + printf("Setting variant to %s\n", variant); + env_set("variant", variant); + env_set("variant1", "bla"); +#ifndef CONFIG_ENV_IS_NOWHERE + env_save(); +#endif +} + +int board_late_init(void) +{ + select_dt_from_module_version(); + return 0; } -- cgit v1.2.3