From patchwork Tue Mar 5 19:57:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 1051978 X-Patchwork-Delegate: promsoft@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="PwK0yyfI"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 44DSST0ZsWz9s3q for ; Wed, 6 Mar 2019 07:00:56 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 90BC4C21DA6; Tue, 5 Mar 2019 19:59:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 5019EC21E16; Tue, 5 Mar 2019 19:59:05 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 6BF3BC21D8A; Tue, 5 Mar 2019 19:58:44 +0000 (UTC) Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by lists.denx.de (Postfix) with ESMTPS id B6A69C21E34 for ; Tue, 5 Mar 2019 19:58:40 +0000 (UTC) Received: from localhost.localdomain (unknown [194.230.155.153]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3720A2075B; Tue, 5 Mar 2019 19:58:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1551815919; bh=Q85TbykKP+lFEasek7LzM7yraqkht9Hj6LpTuaKu7/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PwK0yyfIYiItLAR0IQxN8Ft3iPXZhFQ3Ww1306lwd5vywJONdevWSJ/TvxVBQF6Uj KOoZLZ5k4qH2CejWhnrWqPUQU18PMoP9EruH3nIk3Bq5faJpLHTuAvXkAq+ZAZZqUF Q3yUGY4MscKP0wfwKJOPW9k1z26DALII65iIwwmE= From: Krzysztof Kozlowski To: Albert Aribaud , Jaehoon Chung , Lukasz Majewski , Krzysztof Kozlowski , Simon Glass , Minkyu Kang , Marek Szyprowski , u-boot@lists.denx.de Date: Tue, 5 Mar 2019 20:57:58 +0100 Message-Id: <20190305195802.14397-6-krzk@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190305195802.14397-1-krzk@kernel.org> References: <20190305195802.14397-1-krzk@kernel.org> Subject: [U-Boot] [PATCH v4 5/9] arm: exynos: Wait till ADC stabilizes before checking Odroid HC1 revision X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 Tested-by: Anand Moon --- 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;