summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Krummenacher <max.krummenacher@toradex.com>2020-10-14 19:47:44 +0200
committerMax Krummenacher <max.krummenacher@toradex.com>2020-10-14 20:00:41 +0200
commit41b3b1e36658cc9d3a473e736a1e5559e6e62fd7 (patch)
tree0c7faa50fdb7e576431f433769a6e16d07ee088a
parenteae4ce781c2c7a4f503a9b42b9da27b1ba91ba15 (diff)
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 <max.krummenacher@toradex.com>
-rw-r--r--board/toradex/verdin-imx8mm/verdin-imx8mm.c63
1 files 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 <dm.h>
#include <errno.h>
#include <fsl_esdhc.h>
+#include <i2c.h>
#include <malloc.h>
#include <micrel.h>
#include <miiphy.h>
@@ -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;
}