[U-Boot] [PATCH v3 3/9] arm: exynos: Detect revision later, when all resources are ready

Lukasz Majewski lukma at denx.de
Sun Feb 17 22:34:13 UTC 2019


On Sat, 16 Feb 2019 10:45:42 +0100
Krzysztof Kozlowski <krzk at 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 <krzk at 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 <lukma at 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: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20190217/f71435e4/attachment.sig>


More information about the U-Boot mailing list