Message ID | 20210204091145.19201-1-m.szyprowski@samsung.com |
---|---|
State | Accepted |
Commit | 8bc780106c1399bd263c4283a8747889a613ca5d |
Headers | show |
Series | board: amlogic: odroid: add runtime detection of the N2/N2+/C4/HC4 variants | expand |
Hi, On 04/02/2021 10:11, Marek Szyprowski wrote: > 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> > --- > The relevant vendor's code is here: > https://github.com/hardkernel/u-boot/blob/odroidg12-v2015.01/board/hardkernel/odroid-common/board.c#L55 > --- > arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi | 6 ++ > arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi | 6 ++ > board/amlogic/odroid-n2/odroid-n2.c | 80 +++++++++++++++++++ > configs/odroid-c4_defconfig | 4 +- > configs/odroid-n2_defconfig | 4 +- > 5 files changed, 98 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi > index 236f2468dc..a92f9e9ff1 100644 > --- a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi > +++ b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi > @@ -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>; > +}; > diff --git a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi > index fbcc8287c5..963bf96b25 100644 > --- a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi > +++ b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi > @@ -12,6 +12,12 @@ > 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>; > }; > diff --git a/board/amlogic/odroid-n2/odroid-n2.c b/board/amlogic/odroid-n2/odroid-n2.c > index d9955433bf..2eb7fa93be 100644 > --- a/board/amlogic/odroid-n2/odroid-n2.c > +++ b/board/amlogic/odroid-n2/odroid-n2.c > @@ -6,6 +6,7 @@ > > #include <common.h> > #include <dm.h> > +#include <adc.h> > #include <env.h> > #include <init.h> > #include <net.h> > @@ -19,6 +20,11 @@ > #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,79 @@ int mmc_get_env_dev(void) > return 0; > } > > +/* Variant detection is based on the ADC RAW values for the 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), "amlogic/meson-%s-odroid-%s.dtb", soc, variant); > + env_set("fdtfile", 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]; > @@ -58,5 +137,6 @@ int misc_init_r(void) > meson_generate_serial_ethaddr(); > } > > + odroid_detect_variant(); > return 0; > } > diff --git a/configs/odroid-c4_defconfig b/configs/odroid-c4_defconfig > index 367d22db0b..8a9b8b0c02 100644 > --- a/configs/odroid-c4_defconfig > +++ b/configs/odroid-c4_defconfig > @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y > CONFIG_MESON_G12A=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 > @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y > CONFIG_OF_CONTROL=y > CONFIG_SYS_RELOC_GD_ENV_ADDR=y > CONFIG_NET_RANDOM_ETHADDR=y > +CONFIG_ADC=y > +CONFIG_SARADC_MESON=y > CONFIG_DM_MMC=y > CONFIG_MMC_MESON_GX=y > CONFIG_PHY_REALTEK=y > diff --git a/configs/odroid-n2_defconfig b/configs/odroid-n2_defconfig > index 76c60ab032..b82bd78f2d 100644 > --- a/configs/odroid-n2_defconfig > +++ b/configs/odroid-n2_defconfig > @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y > CONFIG_MESON_G12A=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 > @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y > CONFIG_OF_CONTROL=y > CONFIG_SYS_RELOC_GD_ENV_ADDR=y > CONFIG_NET_RANDOM_ETHADDR=y > +CONFIG_ADC=y > +CONFIG_SARADC_MESON=y > CONFIG_DM_MMC=y > CONFIG_MMC_MESON_GX=y > CONFIG_PHY_REALTEK=y > Nice code ! It' super clean, for me it's ok I let other people review it and I'll push it in a few days if everyone is happy. Neil
On 2/4/21 11:03 PM, Neil Armstrong wrote: > Hi, > > On 04/02/2021 10:11, Marek Szyprowski wrote: >> 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> >> --- >> The relevant vendor's code is here: >> https://protect2.fireeye.com/v1/url?k=482d7422-17b64cfb-482cff6d-0cc47a3356b2-d15937f4c8fdfe96&q=1&e=3e3b54dc-363e-452d-840c-1c29fdfd5c70&u=https%3A%2F%2Fgithub.com%2Fhardkernel%2Fu-boot%2Fblob%2Fodroidg12-v2015.01%2Fboard%2Fhardkernel%2Fodroid-common%2Fboard.c%23L55 >> --- >> arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi | 6 ++ >> arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi | 6 ++ >> board/amlogic/odroid-n2/odroid-n2.c | 80 +++++++++++++++++++ >> configs/odroid-c4_defconfig | 4 +- >> configs/odroid-n2_defconfig | 4 +- >> 5 files changed, 98 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi >> index 236f2468dc..a92f9e9ff1 100644 >> --- a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi >> +++ b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi >> @@ -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>; >> +}; >> diff --git a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi >> index fbcc8287c5..963bf96b25 100644 >> --- a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi >> +++ b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi >> @@ -12,6 +12,12 @@ >> 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>; >> }; >> diff --git a/board/amlogic/odroid-n2/odroid-n2.c b/board/amlogic/odroid-n2/odroid-n2.c >> index d9955433bf..2eb7fa93be 100644 >> --- a/board/amlogic/odroid-n2/odroid-n2.c >> +++ b/board/amlogic/odroid-n2/odroid-n2.c >> @@ -6,6 +6,7 @@ >> >> #include <common.h> >> #include <dm.h> >> +#include <adc.h> >> #include <env.h> >> #include <init.h> >> #include <net.h> >> @@ -19,6 +20,11 @@ >> #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,79 @@ int mmc_get_env_dev(void) >> return 0; >> } >> >> +/* Variant detection is based on the ADC RAW values for the 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), "amlogic/meson-%s-odroid-%s.dtb", soc, variant); >> + env_set("fdtfile", 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]; >> @@ -58,5 +137,6 @@ int misc_init_r(void) >> meson_generate_serial_ethaddr(); >> } >> >> + odroid_detect_variant(); >> return 0; >> } >> diff --git a/configs/odroid-c4_defconfig b/configs/odroid-c4_defconfig >> index 367d22db0b..8a9b8b0c02 100644 >> --- a/configs/odroid-c4_defconfig >> +++ b/configs/odroid-c4_defconfig >> @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y >> CONFIG_MESON_G12A=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 >> @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y >> CONFIG_OF_CONTROL=y >> CONFIG_SYS_RELOC_GD_ENV_ADDR=y >> CONFIG_NET_RANDOM_ETHADDR=y >> +CONFIG_ADC=y >> +CONFIG_SARADC_MESON=y >> CONFIG_DM_MMC=y >> CONFIG_MMC_MESON_GX=y >> CONFIG_PHY_REALTEK=y >> diff --git a/configs/odroid-n2_defconfig b/configs/odroid-n2_defconfig >> index 76c60ab032..b82bd78f2d 100644 >> --- a/configs/odroid-n2_defconfig >> +++ b/configs/odroid-n2_defconfig >> @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y >> CONFIG_MESON_G12A=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 >> @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y >> CONFIG_OF_CONTROL=y >> CONFIG_SYS_RELOC_GD_ENV_ADDR=y >> CONFIG_NET_RANDOM_ETHADDR=y >> +CONFIG_ADC=y >> +CONFIG_SARADC_MESON=y >> CONFIG_DM_MMC=y >> CONFIG_MMC_MESON_GX=y >> CONFIG_PHY_REALTEK=y >> > > Nice code ! It' super clean, > for me it's ok > > I let other people review it and I'll push it in a few days if everyone is happy. Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com> Best Regards, Jaehoon Chung > > Neil >
On 04/02/2021 10:11, Marek Szyprowski wrote: > 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> > --- > The relevant vendor's code is here: > https://github.com/hardkernel/u-boot/blob/odroidg12-v2015.01/board/hardkernel/odroid-common/board.c#L55 > --- > arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi | 6 ++ > arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi | 6 ++ > board/amlogic/odroid-n2/odroid-n2.c | 80 +++++++++++++++++++ > configs/odroid-c4_defconfig | 4 +- > configs/odroid-n2_defconfig | 4 +- > 5 files changed, 98 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi > index 236f2468dc..a92f9e9ff1 100644 > --- a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi > +++ b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi > @@ -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>; > +}; > diff --git a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi > index fbcc8287c5..963bf96b25 100644 > --- a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi > +++ b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi > @@ -12,6 +12,12 @@ > 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>; > }; > diff --git a/board/amlogic/odroid-n2/odroid-n2.c b/board/amlogic/odroid-n2/odroid-n2.c > index d9955433bf..2eb7fa93be 100644 > --- a/board/amlogic/odroid-n2/odroid-n2.c > +++ b/board/amlogic/odroid-n2/odroid-n2.c > @@ -6,6 +6,7 @@ > > #include <common.h> > #include <dm.h> > +#include <adc.h> > #include <env.h> > #include <init.h> > #include <net.h> > @@ -19,6 +20,11 @@ > #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,79 @@ int mmc_get_env_dev(void) > return 0; > } > > +/* Variant detection is based on the ADC RAW values for the 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), "amlogic/meson-%s-odroid-%s.dtb", soc, variant); > + env_set("fdtfile", 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]; > @@ -58,5 +137,6 @@ int misc_init_r(void) > meson_generate_serial_ethaddr(); > } > > + odroid_detect_variant(); > return 0; > } > diff --git a/configs/odroid-c4_defconfig b/configs/odroid-c4_defconfig > index 367d22db0b..8a9b8b0c02 100644 > --- a/configs/odroid-c4_defconfig > +++ b/configs/odroid-c4_defconfig > @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y > CONFIG_MESON_G12A=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 > @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y > CONFIG_OF_CONTROL=y > CONFIG_SYS_RELOC_GD_ENV_ADDR=y > CONFIG_NET_RANDOM_ETHADDR=y > +CONFIG_ADC=y > +CONFIG_SARADC_MESON=y > CONFIG_DM_MMC=y > CONFIG_MMC_MESON_GX=y > CONFIG_PHY_REALTEK=y > diff --git a/configs/odroid-n2_defconfig b/configs/odroid-n2_defconfig > index 76c60ab032..b82bd78f2d 100644 > --- a/configs/odroid-n2_defconfig > +++ b/configs/odroid-n2_defconfig > @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y > CONFIG_MESON_G12A=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 > @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y > CONFIG_OF_CONTROL=y > CONFIG_SYS_RELOC_GD_ENV_ADDR=y > CONFIG_NET_RANDOM_ETHADDR=y > +CONFIG_ADC=y > +CONFIG_SARADC_MESON=y > CONFIG_DM_MMC=y > CONFIG_MMC_MESON_GX=y > CONFIG_PHY_REALTEK=y > Applied to u-boot-amlogic
diff --git a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi index 236f2468dc..a92f9e9ff1 100644 --- a/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi +++ b/arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi @@ -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>; +}; diff --git a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi index fbcc8287c5..963bf96b25 100644 --- a/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi +++ b/arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi @@ -12,6 +12,12 @@ 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>; }; diff --git a/board/amlogic/odroid-n2/odroid-n2.c b/board/amlogic/odroid-n2/odroid-n2.c index d9955433bf..2eb7fa93be 100644 --- a/board/amlogic/odroid-n2/odroid-n2.c +++ b/board/amlogic/odroid-n2/odroid-n2.c @@ -6,6 +6,7 @@ #include <common.h> #include <dm.h> +#include <adc.h> #include <env.h> #include <init.h> #include <net.h> @@ -19,6 +20,11 @@ #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,79 @@ int mmc_get_env_dev(void) return 0; } +/* Variant detection is based on the ADC RAW values for the 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), "amlogic/meson-%s-odroid-%s.dtb", soc, variant); + env_set("fdtfile", 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]; @@ -58,5 +137,6 @@ int misc_init_r(void) meson_generate_serial_ethaddr(); } + odroid_detect_variant(); return 0; } diff --git a/configs/odroid-c4_defconfig b/configs/odroid-c4_defconfig index 367d22db0b..8a9b8b0c02 100644 --- a/configs/odroid-c4_defconfig +++ b/configs/odroid-c4_defconfig @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y CONFIG_MESON_G12A=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 @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y CONFIG_OF_CONTROL=y CONFIG_SYS_RELOC_GD_ENV_ADDR=y CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_ADC=y +CONFIG_SARADC_MESON=y CONFIG_DM_MMC=y CONFIG_MMC_MESON_GX=y CONFIG_PHY_REALTEK=y diff --git a/configs/odroid-n2_defconfig b/configs/odroid-n2_defconfig index 76c60ab032..b82bd78f2d 100644 --- a/configs/odroid-n2_defconfig +++ b/configs/odroid-n2_defconfig @@ -8,7 +8,7 @@ CONFIG_DM_GPIO=y CONFIG_MESON_G12A=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 @@ -26,6 +26,8 @@ CONFIG_CMD_REGULATOR=y CONFIG_OF_CONTROL=y CONFIG_SYS_RELOC_GD_ENV_ADDR=y CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_ADC=y +CONFIG_SARADC_MESON=y CONFIG_DM_MMC=y CONFIG_MMC_MESON_GX=y CONFIG_PHY_REALTEK=y
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> --- The relevant vendor's code is here: https://github.com/hardkernel/u-boot/blob/odroidg12-v2015.01/board/hardkernel/odroid-common/board.c#L55 --- arch/arm/dts/meson-g12b-odroid-n2-u-boot.dtsi | 6 ++ arch/arm/dts/meson-sm1-odroid-c4-u-boot.dtsi | 6 ++ board/amlogic/odroid-n2/odroid-n2.c | 80 +++++++++++++++++++ configs/odroid-c4_defconfig | 4 +- configs/odroid-n2_defconfig | 4 +- 5 files changed, 98 insertions(+), 2 deletions(-) -- 2.17.1