|
@@ -2009,6 +2009,7 @@ static int wm8915_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
|
|
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;
|
|
@@ -2095,7 +2096,18 @@ static int wm8915_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
|
|
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);
|
|
|
|
|
@@ -2103,7 +2115,7 @@ static int wm8915_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
|
|
wm8915->fll_fout = Fout;
|
|
|
wm8915->fll_src = source;
|
|
|
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_GPIOLIB
|