Fix detection of Odroid HC1 (Exynos5422) after reboot if kernel disabled
the LDO4/VDD_ADC regulator.

The LDO4 supplies both ADC block and the ADC input AIN9.  Voltage on
AIN9 will rise slowly, so use delay of 5 milliseconds instead of
timers-based loop to wait for voltage stabilization.

First reads on Odroid HC1 return 305, 1207, 1297 and finally 1308
(reference value is 1309).

Signed-off-by: Krzysztof Kozlowski <k...@kernel.org>
Tested-by: Anand Moon <linux.am...@gmail.com>
---
 board/samsung/common/exynos5-dt-types.c | 38 ++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/board/samsung/common/exynos5-dt-types.c 
b/board/samsung/common/exynos5-dt-types.c
index 7c1271d6547a..516c32923e44 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;
 
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to