On Sat, 16 Feb 2019 10:45:42 +0100 Krzysztof Kozlowski <k...@kernel.org> wrote:
> Detection of board revision is done early - before power setup. In > case of Odroid XU3/XU4/HC1 family, the detection is done using ADC > which is supplied by LDO4/VDD_ADC regulator. This regulator could be > turned off (e.g. by kernel before reboot). If ADC is used early, the > regulators are not yet available and the detection won't work. > > Split the revision detection out of set_board_type() into separate > function called later - either when displaying board info (in late > mode) or during misc_init_r. The idea is that set_board_type() will > be called early so its method of detection are limited to flattened > device tree (exynos5-dt-types.c for Exynos5) or GPIO (odroid.c for > Exynos4412). The newly added set_board_revision() can be called only > later, when resources like regulator are available. > > This is necessary to fix the detection of Odroid HC1 after reboot, if > kernel turned off the LDO4 regulator. > > Signed-off-by: Krzysztof Kozlowski <k...@kernel.org> > --- > board/samsung/common/board.c | 22 +++++++++++++++++++++- > board/samsung/common/exynos5-dt-types.c | 16 +++++++++++++--- > board/samsung/odroid/odroid.c | 8 ++++++++ > include/samsung/misc.h | 1 + > 4 files changed, 43 insertions(+), 4 deletions(-) > > diff --git a/board/samsung/common/board.c > b/board/samsung/common/board.c index 96228a86a117..ef2204742e1d 100644 > --- a/board/samsung/common/board.c > +++ b/board/samsung/common/board.c > @@ -253,7 +253,18 @@ int board_eth_init(bd_t *bis) > 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,15 @@ int board_late_init(void) > #ifdef CONFIG_MISC_INIT_R > int misc_init_r(void) > { > + if (!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/exynos5-dt-types.c > b/board/samsung/common/exynos5-dt-types.c index > 7a86e9187768..7c1271d6547a 100644 --- > a/board/samsung/common/exynos5-dt-types.c +++ > b/board/samsung/common/exynos5-dt-types.c @@ -192,8 +192,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 +214,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/odroid/odroid.c > b/board/samsung/odroid/odroid.c index 552333fe869d..4be8cc9826c3 > 100644 --- a/board/samsung/odroid/odroid.c > +++ b/board/samsung/odroid/odroid.c > @@ -54,6 +54,14 @@ void set_board_type(void) > gd->board_type = ODROID_TYPE_U3; > } > > +void set_board_revision(void) > +{ > + /* > + * Revision already set by set_board_type() because it can be > + * executed early. > + */ > +} > + > const char *get_board_type(void) > { > const char *board_type[] = {"u3", "x2"}; > diff --git a/include/samsung/misc.h b/include/samsung/misc.h > index 017560c25662..4ff28a1df0e8 100644 > --- a/include/samsung/misc.h > +++ b/include/samsung/misc.h > @@ -33,6 +33,7 @@ char *get_dfu_alt_system(char *interface, char > *devstr); char *get_dfu_alt_boot(char *interface, char *devstr); > #endif > void set_board_type(void); > +void set_board_revision(void); > const char *get_board_type(void); > > #endif /* __SAMSUNG_MISC_COMMON_H__ */ Reviewed-by: Lukasz Majewski <lu...@denx.de> Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lu...@denx.de
pgpDsBkjg6qAP.pgp
Description: OpenPGP digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot