Skip to content

Commit

Permalink
ASoC: Error out when FLL lock interrupt is not delivered on WM8915
Browse files Browse the repository at this point in the history
When the FLL locks on the WM8915 an interrupt is generated.  For safety
error out if we don't get that interrupt when the IRQ output of the
WM8915 is hooked up.  Since we *really* expect an interrupt but the
threaded IRQ handler may take a bit longer than expected to get
scheduled also dramatically increase the delay in this case.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>
  • Loading branch information
Mark Brown committed Jun 6, 2011
1 parent ea7b437 commit 51b3b5c
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions sound/soc/codecs/wm8915.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -2095,15 +2096,26 @@ 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);

wm8915->fll_fref = Fref;
wm8915->fll_fout = Fout;
wm8915->fll_src = source;

return 0;
return ret;
}

#ifdef CONFIG_GPIOLIB
Expand Down

0 comments on commit 51b3b5c

Please sign in to comment.