From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lukasz Majewski Date: Fri, 15 Feb 2019 08:15:45 +0100 Subject: [U-Boot] [PATCH v2 5/9] arm: exynos: Wait till ADC stabilizes before checking Odroid HC1 revision In-Reply-To: <20190213164648.26579-6-krzk@kernel.org> References: <20190213164648.26579-1-krzk@kernel.org> <20190213164648.26579-6-krzk@kernel.org> Message-ID: <20190215081545.19e509ee@jawa> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Wed, 13 Feb 2019 17:46:44 +0100 Krzysztof Kozlowski wrote: > 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 be patient and wait for it to stabilize. > > First reads on Odroid HC1 return 305, 1207, 1297 and finally 1308 > (reference value is 1309). > > Signed-off-by: Krzysztof Kozlowski > --- > 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 > af711e727a78..8aed64183837 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; > + } Is there in the documentation any required time to wait before reading the ADC value? If yes then maybe get_timer() based approach shall be used (if get_timer() is available in this context)? Please see for example drivers/net/fec_mxc.c for how timeouts are handled there. I will test this patch series on XU3 during the weekend. Thanks for this fix :-) > + > + 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; > 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: