[PATCH v2] drivers: adc: fix return value if timeout occurs

Francois Berder fberder at outlook.fr
Tue Mar 1 18:11:48 CET 2022


Because unsigned integers cannot be negative,
timeout variable is never less than zero. Hence, checks
in Amlogic Meson ADC driver to detect timeouts always
evaluated to false. Fix that.

Signed-off-by: Francois Berder <fberder at outlook.fr>
---
Changes for v2:
   - Replace timeout handling logic by regmap_read_poll_timeout

 drivers/adc/meson-saradc.c | 33 ++++++++++++++-------------------
 1 file changed, 14 insertions(+), 19 deletions(-)

diff --git a/drivers/adc/meson-saradc.c b/drivers/adc/meson-saradc.c
index 1a45a3a265..b36f09cdb1 100644
--- a/drivers/adc/meson-saradc.c
+++ b/drivers/adc/meson-saradc.c
@@ -192,7 +192,8 @@ meson_saradc_get_fifo_count(struct meson_saradc_priv *priv)
 
 static int meson_saradc_lock(struct meson_saradc_priv *priv)
 {
-	uint val, timeout = 10000;
+	uint val;
+	int ret;
 
 	/* prevent BL30 from using the SAR ADC while we are using it */
 	regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY,
@@ -202,17 +203,14 @@ static int meson_saradc_lock(struct meson_saradc_priv *priv)
 	/*
 	 * wait until BL30 releases it's lock (so we can use the SAR ADC)
 	 */
-	do {
-		udelay(1);
-		regmap_read(priv->regmap, MESON_SAR_ADC_DELAY, &val);
-	} while (val & MESON_SAR_ADC_DELAY_BL30_BUSY && timeout--);
-
-	if (timeout < 0) {
+	ret =
+	    regmap_read_poll_timeout(priv->regmap, MESON_SAR_ADC_DELAY, val,
+				     val & MESON_SAR_ADC_DELAY_BL30_BUSY, 1,
+				     10);
+	if (ret)
 		printf("Timeout while waiting for BL30 unlock\n");
-		return -ETIMEDOUT;
-	}
 
-	return 0;
+	return ret;
 }
 
 static void meson_saradc_unlock(struct meson_saradc_priv *priv)
@@ -246,22 +244,19 @@ static int meson_saradc_calib_val(struct meson_saradc_priv *priv, int val)
 
 static int meson_saradc_wait_busy_clear(struct meson_saradc_priv *priv)
 {
-	uint regval, timeout = 10000;
+	uint regval;
 
 	/*
 	 * NOTE: we need a small delay before reading the status, otherwise
 	 * the sample engine may not have started internally (which would
 	 * seem to us that sampling is already finished).
 	 */
-	do {
-		udelay(1);
-		regmap_read(priv->regmap, MESON_SAR_ADC_REG0, &regval);
-	} while (FIELD_GET(MESON_SAR_ADC_REG0_BUSY_MASK, regval) && timeout--);
+	udelay(1);
 
-	if (timeout < 0)
-		return -ETIMEDOUT;
-
-	return 0;
+	return regmap_read_poll_timeout(priv->regmap, MESON_SAR_ADC_REG0,
+					regval,
+					FIELD_GET(MESON_SAR_ADC_REG0_BUSY_MASK,
+						  regval), 1, 10);
 }
 
 static int meson_saradc_read_raw_sample(struct meson_saradc_priv *priv,
-- 
2.25.1



More information about the U-Boot mailing list