Replace adc timer counter by SoC timer to prevent
EBUSY notifications.

Signed-off-by: Johan Jonker <jbx6...@gmail.com>
---
 drivers/adc/adc-uclass.c      | 10 ++++++----
 drivers/adc/rockchip-saradc.c |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/adc/adc-uclass.c b/drivers/adc/adc-uclass.c
index 3dbdfa6f..a539f999 100644
--- a/drivers/adc/adc-uclass.c
+++ b/drivers/adc/adc-uclass.c
@@ -146,6 +146,7 @@ int adc_channel_data(struct udevice *dev, int channel, 
unsigned int *data)
        struct adc_uclass_plat *uc_pdata = dev_get_uclass_plat(dev);
        const struct adc_ops *ops = dev_get_driver_ops(dev);
        unsigned int timeout_us = uc_pdata->data_timeout_us;
+       unsigned long start_time;
        int ret;
 
        if (!ops->channel_data)
@@ -155,14 +156,14 @@ int adc_channel_data(struct udevice *dev, int channel, 
unsigned int *data)
        if (ret)
                return ret;
 
+       start_time = get_timer(0);
        do {
                ret = ops->channel_data(dev, channel, data);
                if (!ret || ret != -EBUSY)
                        break;
 
-               /* TODO: use timer uclass (for early calls). */
                sdelay(5);
-       } while (timeout_us--);
+       } while (get_timer(start_time) < timeout_us);
 
        return ret;
 }
@@ -173,6 +174,7 @@ int adc_channels_data(struct udevice *dev, unsigned int 
channel_mask,
        struct adc_uclass_plat *uc_pdata = dev_get_uclass_plat(dev);
        unsigned int timeout_us = uc_pdata->multidata_timeout_us;
        const struct adc_ops *ops = dev_get_driver_ops(dev);
+       unsigned long start_time;
        int ret;
 
        if (!ops->channels_data)
@@ -182,14 +184,14 @@ int adc_channels_data(struct udevice *dev, unsigned int 
channel_mask,
        if (ret)
                return ret;
 
+       start_time = get_timer(0);
        do {
                ret = ops->channels_data(dev, channel_mask, channels);
                if (!ret || ret != -EBUSY)
                        break;
 
-               /* TODO: use timer uclass (for early calls). */
                sdelay(5);
-       } while (timeout_us--);
+       } while (get_timer(start_time) < timeout_us);
 
        return ret;
 }
diff --git a/drivers/adc/rockchip-saradc.c b/drivers/adc/rockchip-saradc.c
index f61cfe4b..e6a0341d 100644
--- a/drivers/adc/rockchip-saradc.c
+++ b/drivers/adc/rockchip-saradc.c
@@ -183,7 +183,7 @@ int rockchip_saradc_of_to_plat(struct udevice *dev)
 
        uc_pdata->data_mask = (1 << priv->data->num_bits) - 1;
        uc_pdata->data_format = ADC_DATA_FORMAT_BIN;
-       uc_pdata->data_timeout_us = SARADC_TIMEOUT / 5;
+       uc_pdata->data_timeout_us = SARADC_TIMEOUT;
        uc_pdata->channel_mask = (1 << priv->data->num_channels) - 1;
 
        return 0;
-- 
2.20.1

Reply via email to