Skip to content

Commit

Permalink
ASoC: Check that WM8996 FLL started even if we don't have the IRQ
Browse files Browse the repository at this point in the history
We can directly read the FLL lock status on WM8996 so even if we don't
have an interrupt wired up we can still verify that the FLL started
successfully.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>
  • Loading branch information
Mark Brown committed Sep 6, 2011
1 parent 11323e3 commit 27b6d92
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions sound/soc/codecs/wm8996.c
Original file line number Diff line number Diff line change
Expand Up @@ -2054,7 +2054,7 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
struct i2c_client *i2c = to_i2c_client(codec->dev);
struct _fll_div fll_div;
unsigned long timeout;
int ret, reg;
int ret, reg, retry;

/* Any change? */
if (source == wm8996->fll_src && Fref == wm8996->fll_fref &&
Expand Down Expand Up @@ -2141,17 +2141,29 @@ static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
else
timeout = msecs_to_jiffies(2);

/* Allow substantially longer if we've actually got the IRQ */
/* Allow substantially longer if we've actually got the IRQ, poll
* at a slightly higher rate if we don't.
*/
if (i2c->irq)
timeout *= 1000;
timeout *= 10;
else
timeout /= 2;

ret = wait_for_completion_timeout(&wm8996->fll_lock, timeout);
for (retry = 0; retry < 10; retry++) {
ret = wait_for_completion_timeout(&wm8996->fll_lock,
timeout);
if (ret != 0) {
WARN_ON(!i2c->irq);
break;
}

if (ret == 0 && i2c->irq) {
ret = snd_soc_read(codec, WM8996_INTERRUPT_RAW_STATUS_2);
if (ret & WM8996_FLL_LOCK_STS)
break;
}
if (retry == 10) {
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);
Expand Down

0 comments on commit 27b6d92

Please sign in to comment.