
Hi Krzysztof,
Detection of board type 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.
Try to detect the revision again, once power is brought up.
This is necessary to fix the detection of Odroid HC1 after reboot, if kernel turned off the LDO4 regulator. Otherwise the board is not detected....
But such approach seems not to be the optimal one (as we perform detection twice - with default LDO4 enabled after power on and after soft reset).
I would expect to enable the LDO4 regulator in the early code (I2C would be probably necessary) and then read ADC value properly once.
(I also guess that the "work-by-chance" approach is caused by default settings of PMIC after power on).
As fair as I remember, TI is able to read the EEPROM via I2C in the very early u-boot (MLO to be precise) code and then make the decision regarding the platform.
Maybe it would be possible to do the same with Samsung?
And another thought - if the set_board_type() can be called latter and it works - why cannot we move it to this latter point and execute exactly once?
Signed-off-by: Krzysztof Kozlowski krzk@kernel.org
board/samsung/common/board.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/board/samsung/common/board.c b/board/samsung/common/board.c index 6fd26a3a9198..1e2dabe68d11 100644 --- a/board/samsung/common/board.c +++ b/board/samsung/common/board.c @@ -147,6 +147,11 @@ int board_early_init_f(void) { int err; #ifdef CONFIG_BOARD_TYPES
- /*
* It is done early so power might not be set up yet. In
such case
* specific revision detection with ADC might not work and
need to me
* redone later.
set_board_type();*/
#endif err = board_uart_init(); @@ -166,9 +171,21 @@ int board_early_init_f(void) #if defined(CONFIG_POWER) || defined(CONFIG_DM_PMIC) int power_init_board(void) {
- int ret;
- set_ps_hold_ctrl();
- return exynos_power_init();
- ret = exynos_power_init();
+#ifdef CONFIG_BOARD_TYPES
- /*
* Since power is on, redo the board detection (external
peripherals
* are on).
*/
- set_board_type();
+#endif
- return ret;
} #endif
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@denx.de