board: amlogic: odroid: add runtime detection of the N2/N2+/C4/HC4 variants 74/253074/4 accepted/tizen/unified/20210210.052157 submit/tizen/20210209.230141
authorMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 3 Feb 2021 14:36:14 +0000 (15:36 +0100)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Fri, 5 Feb 2021 14:13:05 +0000 (15:13 +0100)
Use the ADC channel 1 to check the hardware revision of the board and
detect the N2 vs. N2+ and the C4 vs. HC4 variants. Each of them use
different dtb file, so adjust fdtfile environment variable to the
detected variant.

The ADC min/max values for each variant are taken from the vendor code,
adjusted to the 12-bit ADC driver operation mode (vendor code use 10-bit
mode).

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: I702a531c24b0fa9bdc1618defa1e0cc2b55c81c5

arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi
arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi
board/amlogic/odroid-n2/odroid-n2.c
configs/odroid-c4_defconfig
configs/odroid-n2_defconfig
include/samsung/tizen_amlogic.h

index 236f246..a92f9e9 100644 (file)
@@ -5,3 +5,9 @@
  */
 
 #include "meson-g12-common-u-boot.dtsi"
+
+/* SARADC is needed for proper board variant detection */
+&saradc {
+       status = "okay";
+       vref-supply = <&vddao_1v8>;
+};
index be41bd7..474a380 100644 (file)
        snps,reset-active-low;
 };
 
+/* SARADC is needed for proper board variant detection */
+&saradc {
+       status = "okay";
+       vref-supply = <&vddao_1v8>;
+};
+
 &tflash_vdd {
        gpio = <&gpio_ao GPIOAO_3 GPIO_OPEN_DRAIN>;
 };
index ca2ec65..5e45e1d 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <adc.h>
 #include <env.h>
 #include <init.h>
 #include <net.h>
 #define EFUSE_MAC_SIZE         12
 #define MAC_ADDR_LEN           6
 
+#define ODROID_HW_VS_ADC_CHANNEL       1
+
+#define MESON_SOC_ID_G12B      0x29
+#define MESON_SOC_ID_SM1       0x2b
+
 int mmc_get_env_dev(void)
 {
        if (meson_get_boot_device() == BOOT_DEVICE_EMMC)
@@ -26,6 +32,82 @@ int mmc_get_env_dev(void)
        return 0;
 }
 
+/* Variant detection is based on ADC RAW values for channel 1 */
+static struct meson_odroid_boards {
+       unsigned int soc_id;
+       unsigned int adc_min;
+       unsigned int adc_max;
+       char *variant;
+} boards[] = {
+       /* OdroidN2 rev 2018,7,23 */
+       { MESON_SOC_ID_G12B, 80 * 4,  90 * 4, "n2" },
+       /* OdroidN2 rev 2018,12,6 */
+       { MESON_SOC_ID_G12B, 160 * 4, 170 * 4, "n2" },
+       /* OdroidN2 rev 2019,1,17 */
+       { MESON_SOC_ID_G12B, 245 * 4, 255 * 4, "n2" },
+       /* OdroidN2 rev 2019,2,7 */
+       { MESON_SOC_ID_G12B, 330 * 4, 350 * 4, "n2" },
+       /* OdroidN2plus rev 2019,11,20 */
+       { MESON_SOC_ID_G12B, 410 * 4, 430 * 4, "n2_plus" },
+       /* OdroidC4 rev 2020,01,29 */
+       { MESON_SOC_ID_SM1,   80 * 4, 100 * 4, "c4" },
+       /* OdroidHC4 rev 2019,12,10 */
+       { MESON_SOC_ID_SM1,  300 * 4, 320 * 4, "hc4" },
+       /* OdroidC4 rev 2019,11,29 */
+       { MESON_SOC_ID_SM1,  335 * 4, 345 * 4, "c4" },
+       /* OdroidHC4 rev 2020,8,7 */
+       { MESON_SOC_ID_SM1,  590 * 4, 610 * 4, "hc4" },
+};
+
+static void odroid_set_fdtfile(char *soc, char *variant)
+{
+       char s[128];
+
+       snprintf(s, sizeof(s), "meson64_odroid%s.dtb", variant);
+       env_set("fdtfile", s);
+
+       snprintf(s, sizeof(s), "meson-%s-odroid-%s.dtb", soc, variant);
+       env_set("fdtfile2", s);
+}
+
+static int odroid_detect_variant(void)
+{
+       char *variant = "", *soc = "";
+       unsigned int adcval = 0;
+       int ret, i, soc_id = 0;
+
+       if (of_machine_is_compatible("amlogic,sm1")) {
+               soc_id = MESON_SOC_ID_SM1;
+               soc = "sm1";
+       } else if (of_machine_is_compatible("amlogic,g12b")) {
+               soc_id = MESON_SOC_ID_G12B;
+               soc = "g12b";
+       } else {
+               return -1;
+       }
+
+       ret = adc_channel_single_shot("adc@9000", ODROID_HW_VS_ADC_CHANNEL,
+                                     &adcval);
+       if (ret)
+               return ret;
+
+       for (i = 0 ; i < ARRAY_SIZE(boards) ; ++i) {
+               if (soc_id == boards[i].soc_id &&
+                   adcval >= boards[i].adc_min &&
+                   adcval < boards[i].adc_max) {
+                       variant = boards[i].variant;
+                       break;
+               }
+       }
+
+       printf("Board variant: %s\n", variant);
+       env_set("variant", variant);
+
+       odroid_set_fdtfile(soc, variant);
+
+       return 0;
+}
+
 int misc_init_r(void)
 {
        u8 mac_addr[MAC_ADDR_LEN];
@@ -54,5 +136,6 @@ int misc_init_r(void)
                        meson_generate_serial_ethaddr();
        }
 
+       odroid_detect_variant();
        return 0;
 }
index c0cafb8..58ce4be 100644 (file)
@@ -9,7 +9,7 @@ CONFIG_MESON_G12A=y
 CONFIG_TIZEN_ODROID_C4=y
 CONFIG_DEBUG_UART_BASE=0xff803000
 CONFIG_DEBUG_UART_CLOCK=24000000
-CONFIG_IDENT_STRING=" odroid-c4"
+CONFIG_IDENT_STRING=" odroid-c4/hc4"
 CONFIG_DEFAULT_DEVICE_TREE="meson-sm1-odroid-c4"
 CONFIG_DEBUG_UART=y
 CONFIG_OF_BOARD_SETUP=y
@@ -39,6 +39,8 @@ CONFIG_ENV_FAT_FILE="params-c4.bin"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_ADC=y
+CONFIG_SARADC_MESON=y
 CONFIG_BUTTON=y
 CONFIG_BUTTON_GPIO=y
 CONFIG_DFU_MMC=y
index 7fdac3b..e9c46c8 100644 (file)
@@ -9,7 +9,7 @@ CONFIG_MESON_G12A=y
 CONFIG_TIZEN_ODROID_N2=y
 CONFIG_DEBUG_UART_BASE=0xff803000
 CONFIG_DEBUG_UART_CLOCK=24000000
-CONFIG_IDENT_STRING=" odroid-n2"
+CONFIG_IDENT_STRING=" odroid-n2/n2_plus"
 CONFIG_DEFAULT_DEVICE_TREE="meson-g12b-odroid-n2"
 CONFIG_DEBUG_UART=y
 CONFIG_OF_BOARD_SETUP=y
@@ -39,6 +39,8 @@ CONFIG_ENV_FAT_FILE="params-n2.bin"
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_ADC=y
+CONFIG_SARADC_MESON=y
 CONFIG_DFU_MMC=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_MESON_GX=y
index 2d08853..655a0ee 100644 (file)
 #define DFU_ALT_SYSTEM                         \
        "Image.gz fat -1 1;"                    \
        "meson64_odroidn2.dtb fat -1 1;"        \
+       "meson64_odroidn2_plus.dtb fat -1 1;"   \
        "meson64_odroidc4.dtb fat -1 1;"        \
+       "meson64_odroidhc4.dtb fat -1 1;"       \
        "kvim3_linux.dtb fat -1 1;"             \
        "kvim3l_linux.dtb fat -1 1;"            \
        "meson-g12b-odroid-n2.dtb fat -1 1;"    \
+       "meson-g12b-odroid-n2_plus.dtb fat -1 1;" \
        "meson-sm1-odroid-c4.dtb fat -1 1;"     \
+       "meson-sm1-odroid-hc4.dtb fat -1 1;"    \
        "meson-g12b-a311d-khadas-vim3.dtb fat -1 1;" \
        "meson-sm1-khadas-vim3l.dtb fat -1 1;"  \
        "boot.scr.uimg fat -1 1;"               \