unsigned int Fref, unsigned int Fout)
 {
        struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec);
+       struct i2c_client *i2c = to_i2c_client(codec->dev);
        struct _fll_div fll_div;
        unsigned long timeout;
        int ret, reg;
        else
                timeout = msecs_to_jiffies(2);
 
-       wait_for_completion_timeout(&wm8915->fll_lock, timeout);
+       /* Allow substantially longer if we've actually got the IRQ */
+       if (i2c->irq)
+               timeout *= 1000;
+
+       ret = wait_for_completion_timeout(&wm8915->fll_lock, timeout);
+
+       if (ret == 0 && i2c->irq) {
+               dev_err(codec->dev, "Timed out waiting for FLL\n");
+               ret = -ETIMEDOUT;
+       } else {
+               ret = 0;
+       }
 
        dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout);
 
        wm8915->fll_fout = Fout;
        wm8915->fll_src = source;
 
-       return 0;
+       return ret;
 }
 
 #ifdef CONFIG_GPIOLIB