#include <linux/hwspinlock.h>
 #include <linux/iio/iio.h>
-#include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/nvmem-consumer.h>
 #include <linux/of.h>
 /* Bits definitions for SC27XX_ADC_INT_CLR registers */
 #define SC27XX_ADC_IRQ_CLR             BIT(0)
 
+/* Bits definitions for SC27XX_ADC_INT_RAW registers */
+#define SC27XX_ADC_IRQ_RAW             BIT(0)
+
 /* Mask definition for SC27XX_ADC_DATA register */
 #define SC27XX_ADC_DATA_MASK           GENMASK(11, 0)
 
 /* Timeout (ms) for the trylock of hardware spinlocks */
 #define SC27XX_ADC_HWLOCK_TIMEOUT      5000
 
-/* Timeout (ms) for ADC data conversion according to ADC datasheet */
-#define SC27XX_ADC_RDY_TIMEOUT         100
+/* Timeout (us) for ADC data conversion according to ADC datasheet */
+#define SC27XX_ADC_RDY_TIMEOUT         1000000
+#define SC27XX_ADC_POLL_RAW_STATUS     500
 
 /* Maximum ADC channel number */
 #define SC27XX_ADC_CHANNEL_MAX         32
         * subsystems which will access the unique ADC controller.
         */
        struct hwspinlock *hwlock;
-       struct completion completion;
        int channel_scale[SC27XX_ADC_CHANNEL_MAX];
        u32 base;
-       int value;
        int irq;
 };
 
                           int scale, int *val)
 {
        int ret;
-       u32 tmp;
-
-       reinit_completion(&data->completion);
+       u32 tmp, value, status;
 
        ret = hwspin_lock_timeout_raw(data->hwlock, SC27XX_ADC_HWLOCK_TIMEOUT);
        if (ret) {
        if (ret)
                goto unlock_adc;
 
+       ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR,
+                                SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR);
+       if (ret)
+               goto disable_adc;
+
        /* Configure the channel id and scale */
        tmp = (scale << SC27XX_ADC_SCALE_SHIFT) & SC27XX_ADC_SCALE_MASK;
        tmp |= channel & SC27XX_ADC_CHN_ID_MASK;
        if (ret)
                goto disable_adc;
 
-       ret = wait_for_completion_timeout(&data->completion,
-                               msecs_to_jiffies(SC27XX_ADC_RDY_TIMEOUT));
-       if (!ret) {
-               dev_err(data->dev, "read ADC data timeout\n");
-               ret = -ETIMEDOUT;
-       } else {
-               ret = 0;
+       ret = regmap_read_poll_timeout(data->regmap,
+                                      data->base + SC27XX_ADC_INT_RAW,
+                                      status, (status & SC27XX_ADC_IRQ_RAW),
+                                      SC27XX_ADC_POLL_RAW_STATUS,
+                                      SC27XX_ADC_RDY_TIMEOUT);
+       if (ret) {
+               dev_err(data->dev, "read adc timeout, status = 0x%x\n", status);
+               goto disable_adc;
        }
 
+       ret = regmap_read(data->regmap, data->base + SC27XX_ADC_DATA, &value);
+       if (ret)
+               goto disable_adc;
+
+       value &= SC27XX_ADC_DATA_MASK;
+
 disable_adc:
        regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL,
                           SC27XX_ADC_EN, 0);
        hwspin_unlock_raw(data->hwlock);
 
        if (!ret)
-               *val = data->value;
+               *val = value;
 
        return ret;
 }
 
-static irqreturn_t sc27xx_adc_isr(int irq, void *dev_id)
-{
-       struct sc27xx_adc_data *data = dev_id;
-       int ret;
-
-       ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR,
-                                SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR);
-       if (ret)
-               return IRQ_RETVAL(ret);
-
-       ret = regmap_read(data->regmap, data->base + SC27XX_ADC_DATA,
-                         &data->value);
-       if (ret)
-               return IRQ_RETVAL(ret);
-
-       data->value &= SC27XX_ADC_DATA_MASK;
-       complete(&data->completion);
-
-       return IRQ_HANDLED;
-}
-
 static void sc27xx_adc_volt_ratio(struct sc27xx_adc_data *data,
                                  int channel, int scale,
                                  u32 *div_numerator, u32 *div_denominator)
        if (ret)
                goto disable_adc;
 
-       ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_EN,
-                                SC27XX_ADC_IRQ_EN, SC27XX_ADC_IRQ_EN);
-       if (ret)
-               goto disable_clk;
-
        /* ADC channel scales' calibration from nvmem device */
        ret = sc27xx_adc_scale_calibration(data, true);
        if (ret)
 {
        struct sc27xx_adc_data *data = _data;
 
-       regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_EN,
-                          SC27XX_ADC_IRQ_EN, 0);
-
        /* Disable ADC work clock and controller clock */
        regmap_update_bits(data->regmap, SC27XX_ARM_CLK_EN,
                           SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0);
                return ret;
        }
 
-       init_completion(&sc27xx_data->completion);
        sc27xx_data->dev = dev;
 
        ret = sc27xx_adc_enable(sc27xx_data);
                return ret;
        }
 
-       ret = devm_request_threaded_irq(dev, sc27xx_data->irq, NULL,
-                                       sc27xx_adc_isr, IRQF_ONESHOT,
-                                       pdev->name, sc27xx_data);
-       if (ret) {
-               dev_err(dev, "failed to request ADC irq\n");
-               return ret;
-       }
-
        indio_dev->dev.parent = dev;
        indio_dev->name = dev_name(dev);
        indio_dev->modes = INDIO_DIRECT_MODE;