iio: dac: adi-axi-dac: fix bus read
authorAngelo Dureghello <adureghello@baylibre.com>
Wed, 9 Apr 2025 09:16:54 +0000 (11:16 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 7 May 2025 18:40:38 +0000 (19:40 +0100)
Fix bus read function.

Testing the driver, on a random basis, wrong reads was detected, mainly
by a wrong DAC chip ID read at first boot.
Before reading the expected value from the AXI regmap, need always to
wait for busy flag to be cleared.

Fixes: e61d7178429a ("iio: dac: adi-axi-dac: extend features")
Signed-off-by: Angelo Dureghello <adureghello@baylibre.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Link: https://patch.msgid.link/20250409-ad3552r-fix-bus-read-v2-1-34d3b21e8ca0@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/dac/adi-axi-dac.c

index 892d770aec69c4259de777058801c9ab33c79923..05b374e137d35d4e78db846f4ecb053e0719982f 100644 (file)
@@ -707,6 +707,7 @@ static int axi_dac_bus_reg_read(struct iio_backend *back, u32 reg, u32 *val,
 {
        struct axi_dac_state *st = iio_backend_get_priv(back);
        int ret;
+       u32 ival;
 
        guard(mutex)(&st->lock);
 
@@ -719,6 +720,13 @@ static int axi_dac_bus_reg_read(struct iio_backend *back, u32 reg, u32 *val,
        if (ret)
                return ret;
 
+       ret = regmap_read_poll_timeout(st->regmap,
+                               AXI_DAC_UI_STATUS_REG, ival,
+                               FIELD_GET(AXI_DAC_UI_STATUS_IF_BUSY, ival) == 0,
+                               10, 100 * KILO);
+       if (ret)
+               return ret;
+
        return regmap_read(st->regmap, AXI_DAC_CUSTOM_RD_REG, val);
 }