diff options
author | Stefano Babic <sbabic@denx.de> | 2019-03-31 19:54:10 +0200 |
---|---|---|
committer | Stefano Babic <sbabic@denx.de> | 2019-03-31 19:54:10 +0200 |
commit | 66c433ed4342e5761ee9b048c85fe47d31130b2e (patch) | |
tree | 60977b825765ebe490b01aae2154002eeea6a76b /board/samsung/common | |
parent | 4b387deb78dcbe491c1f73fdd758f4ca3307bbbe (diff) | |
parent | c3aef9339ce0592b06c8d44cf2eaf9e6f3713e4f (diff) |
Merge branch 'master' of git://git.denx.de/u-boot
Signed-off-by: Stefano Babic <sbabic@denx.de>
Diffstat (limited to 'board/samsung/common')
-rw-r--r-- | board/samsung/common/board.c | 25 | ||||
-rw-r--r-- | board/samsung/common/bootscripts/autoboot.cmd | 10 | ||||
-rw-r--r-- | board/samsung/common/exynos5-dt-types.c | 54 | ||||
-rw-r--r-- | board/samsung/common/misc.c | 2 |
4 files changed, 79 insertions, 12 deletions
diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c index 96228a86a1..9adbd1e2cf 100644 --- a/board/samsung/common/board.c +++ b/board/samsung/common/board.c @@ -249,11 +249,22 @@ int board_eth_init(bd_t *bis) return 0; } -#ifdef CONFIG_DISPLAY_BOARDINFO +#if defined(CONFIG_DISPLAY_BOARDINFO) || defined(CONFIG_DISPLAY_BOARDINFO_LATE) int checkboard(void) { if (IS_ENABLED(CONFIG_BOARD_TYPES)) { - const char *board_info = get_board_type(); + const char *board_info; + + if (IS_ENABLED(CONFIG_DISPLAY_BOARDINFO_LATE)) { + /* + * Printing type requires having revision, although + * this will succeed only if done late. + * Otherwise revision will be set in misc_init_r(). + */ + set_board_revision(); + } + + board_info = get_board_type(); if (board_info) printf("Type: %s\n", board_info); @@ -287,6 +298,16 @@ int board_late_init(void) #ifdef CONFIG_MISC_INIT_R int misc_init_r(void) { + if (IS_ENABLED(CONFIG_BOARD_TYPES) && + !IS_ENABLED(CONFIG_DISPLAY_BOARDINFO_LATE)) { + /* + * If revision was not set by late display boardinfo, + * set it here. At this point regulators should be already + * available. + */ + set_board_revision(); + } + #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG set_board_info(); #endif diff --git a/board/samsung/common/bootscripts/autoboot.cmd b/board/samsung/common/bootscripts/autoboot.cmd index 11c724c4e0..d66bcccf5d 100644 --- a/board/samsung/common/bootscripts/autoboot.cmd +++ b/board/samsung/common/bootscripts/autoboot.cmd @@ -3,7 +3,7 @@ # ./tools/mkimage -c none -A arm -T script -d autoboot.cmd boot.scr # # It requires a list of environment variables to be defined before load: -# platform dependent: boardname, fdtfile, console +# platform dependent: board_name, fdtfile, console # system dependent: mmcbootdev, mmcbootpart, mmcrootdev, mmcrootpart, rootfstype # setenv fdtaddr "40800000" @@ -35,17 +35,17 @@ else setenv initrd_addr -; fi;" -#### Routine: boot_fit - check that env $boardname is set and boot proper config of ITB image +#### Routine: boot_fit - check that env $board_name is set and boot proper config of ITB image setenv setboot_fit " -if test -e '${boardname}'; then +if test -e '${board_name}'; then setenv fdt_addr ; setenv initrd_addr ; setenv kerneladdr 0x42000000; setenv kernelname Image.itb; - setenv itbcfg "\"#${boardname}\""; + setenv itbcfg "\"#${board_name}\""; setenv imgbootcmd bootm; else - echo Warning! Variable: \$boardname is undefined!; + echo Warning! Variable: \$board_name is undefined!; fi" #### Routine: setboot_uimg - prepare env to boot uImage diff --git a/board/samsung/common/exynos5-dt-types.c b/board/samsung/common/exynos5-dt-types.c index 7a86e91877..516c32923e 100644 --- a/board/samsung/common/exynos5-dt-types.c +++ b/board/samsung/common/exynos5-dt-types.c @@ -57,12 +57,48 @@ static unsigned int odroid_get_rev(void) return 0; } +/* + * Read ADC at least twice and check the resuls. If regulator providing voltage + * on to measured point was just turned on, first reads might require time + * to stabilize. + */ +static int odroid_get_adc_val(unsigned int *adcval) +{ + unsigned int adcval_prev = 0; + int ret, retries = 20; + + ret = adc_channel_single_shot("adc", CONFIG_ODROID_REV_AIN, + &adcval_prev); + if (ret) + return ret; + + while (retries--) { + mdelay(5); + + ret = adc_channel_single_shot("adc", CONFIG_ODROID_REV_AIN, + adcval); + if (ret) + return ret; + + /* + * If difference between ADC reads is less than 3%, + * accept the result + */ + if ((100 * abs(*adcval - adcval_prev) / adcval_prev) < 3) + return ret; + + adcval_prev = *adcval; + } + + return ret; +} + static int odroid_get_board_type(void) { unsigned int adcval; int ret, i; - ret = adc_channel_single_shot("adc", CONFIG_ODROID_REV_AIN, &adcval); + ret = odroid_get_adc_val(&adcval); if (ret) goto rev_default; @@ -192,8 +228,11 @@ const char *get_board_type(void) /** * set_board_type() - set board type in gd->board_type. - * As default type set EXYNOS5_BOARD_GENERIC, if detect Odroid, - * then set its proper type. + * As default type set EXYNOS5_BOARD_GENERIC. If Odroid is detected, + * set its proper type based on device tree. + * + * This might be called early when some more specific ways to detect revision + * are not yet available. */ void set_board_type(void) { @@ -211,8 +250,15 @@ void set_board_type(void) gd->board_type = of_match->data; break; } +} - /* If Odroid, then check its revision */ +/** + * set_board_revision() - set detailed board type in gd->board_type. + * Should be called when resources (e.g. regulators) are available + * so ADC can be used to detect the specific revision of a board. + */ +void set_board_revision(void) +{ if (board_is_odroidxu3()) gd->board_type = odroid_get_board_type(); } diff --git a/board/samsung/common/misc.c b/board/samsung/common/misc.c index 05243fc896..53cd1b2907 100644 --- a/board/samsung/common/misc.c +++ b/board/samsung/common/misc.c @@ -101,7 +101,7 @@ void set_board_info(void) bdtype = ""; sprintf(info, "%s%s", bdname, bdtype); - env_set("boardname", info); + env_set("board_name", info); #endif snprintf(info, ARRAY_SIZE(info), "%s%x-%s%s.dtb", CONFIG_SYS_SOC, s5p_cpu_id, bdname, bdtype); |