return ret;
 }
 
+static int cs43130_wait_for_completion(struct cs43130_private *cs43130, struct completion *to_poll,
+                                       int time)
+{
+       int stickies, offset, flag, ret;
+
+       if (cs43130->has_irq_line) {
+               ret = wait_for_completion_timeout(to_poll, msecs_to_jiffies(time));
+               if (ret == 0)
+                       return -ETIMEDOUT;
+               else
+                       return 0; // Discard number of jiffies left till timeout and return success
+       }
+
+       if (to_poll == &cs43130->xtal_rdy) {
+               offset = 0;
+               flag = CS43130_XTAL_RDY_INT;
+       } else if (to_poll == &cs43130->pll_rdy) {
+               offset = 0;
+               flag = CS43130_PLL_RDY_INT;
+       } else {
+               return -EINVAL;
+       }
+
+       return regmap_read_poll_timeout(cs43130->regmap, CS43130_INT_STATUS_1 + offset,
+                                       stickies, (stickies & flag),
+                                       1000, time * 1000);
+}
+
 static int cs43130_change_clksrc(struct snd_soc_component *component,
                                 enum cs43130_mclk_src_sel src)
 {
                                           CS43130_XTAL_RDY_INT_MASK, 0);
                        regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
                                           CS43130_PDN_XTAL_MASK, 0);
-                       ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
-                                                         msecs_to_jiffies(100));
+                       ret = cs43130_wait_for_completion(cs43130, &cs43130->xtal_rdy, 100);
                        regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
                                           CS43130_XTAL_RDY_INT_MASK,
                                           1 << CS43130_XTAL_RDY_INT_SHIFT);
-                       if (ret == 0) {
-                               dev_err(cs43130->dev, "Timeout waiting for XTAL_READY interrupt\n");
-                               return -ETIMEDOUT;
+                       if (ret) {
+                               dev_err(cs43130->dev, "Error waiting for XTAL_READY interrupt: %d\n", ret);
+                               return ret;
                        }
                }
 
                                           CS43130_XTAL_RDY_INT_MASK, 0);
                        regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
                                           CS43130_PDN_XTAL_MASK, 0);
-                       ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
-                                                         msecs_to_jiffies(100));
+                       ret = cs43130_wait_for_completion(cs43130, &cs43130->xtal_rdy, 100);
                        regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
                                           CS43130_XTAL_RDY_INT_MASK,
                                           1 << CS43130_XTAL_RDY_INT_SHIFT);
-                       if (ret == 0) {
-                               dev_err(cs43130->dev, "Timeout waiting for XTAL_READY interrupt\n");
-                               return -ETIMEDOUT;
+                       if (ret) {
+                               dev_err(cs43130->dev, "Error waiting for XTAL_READY interrupt: %d\n", ret);
+                               return ret;
                        }
                }
 
                                   CS43130_PLL_RDY_INT_MASK, 0);
                regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
                                   CS43130_PDN_PLL_MASK, 0);
-               ret = wait_for_completion_timeout(&cs43130->pll_rdy,
-                                                 msecs_to_jiffies(100));
+               ret = cs43130_wait_for_completion(cs43130, &cs43130->pll_rdy, 100);
                regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
                                   CS43130_PLL_RDY_INT_MASK,
                                   1 << CS43130_PLL_RDY_INT_SHIFT);
-               if (ret == 0) {
-                       dev_err(cs43130->dev, "Timeout waiting for PLL_READY interrupt\n");
-                       return -ETIMEDOUT;
+               if (ret) {
+                       dev_err(cs43130->dev, "Error waiting for PLL_READY interrupt: %d\n", ret);
+                       return ret;
                }
 
                regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
        regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk);
        if (!ret) {
                dev_err(cs43130->dev, "Timeout waiting for HPLOAD interrupt\n");
-               return -1;
+               return -ETIMEDOUT;
        }
 
        dev_dbg(cs43130->dev, "HP load stat: %x, INT_MASK_4: %x\n",
        init_completion(&cs43130->pll_rdy);
        init_completion(&cs43130->hpload_evt);
 
-       ret = devm_request_threaded_irq(cs43130->dev, client->irq,
-                                       NULL, cs43130_irq_thread,
-                                       IRQF_ONESHOT | IRQF_TRIGGER_LOW,
-                                       "cs43130", cs43130);
-       if (ret != 0) {
-               dev_err(cs43130->dev, "Failed to request IRQ: %d\n", ret);
-               goto err;
+       if (!client->irq) {
+               dev_dbg(cs43130->dev, "IRQ not found, will poll instead\n");
+               cs43130->has_irq_line = 0;
+       } else {
+               ret = devm_request_threaded_irq(cs43130->dev, client->irq,
+                                               NULL, cs43130_irq_thread,
+                                               IRQF_ONESHOT | IRQF_TRIGGER_LOW,
+                                               "cs43130", cs43130);
+               if (ret != 0) {
+                       dev_err(cs43130->dev, "Failed to request IRQ: %d\n", ret);
+                       goto err;
+               }
+               cs43130->has_irq_line = 1;
        }
 
        cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;