Skip to content

Commit

Permalink
ASoC: S3C lrsync function made to work with IRQs disabled.
Browse files Browse the repository at this point in the history
s3c2412_snd_lrsync() maybe reached with IRQs disabled and if LRCLK
is dead due to improper initialization of CPU or CODEC, the system
gets stuck in the loop because jiffies may never get updated.
Implemented counter based wait mechanism for atleast the same
timeout period.

Signed-off-by: Jassi <jassi.brar@samsung.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
Jassi authored and Mark Brown committed Sep 15, 2009
1 parent 3eef08b commit fa68e00
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions sound/soc/s3c24xx/s3c-i2s-v2.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,26 +230,30 @@ static void s3c2412_snd_rxctrl(struct s3c_i2sv2_info *i2s, int on)
pr_debug("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
}

#define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t)

/*
* Wait for the LR signal to allow synchronisation to the L/R clock
* from the codec. May only be needed for slave mode.
*/
static int s3c2412_snd_lrsync(struct s3c_i2sv2_info *i2s)
{
u32 iiscon;
unsigned long timeout = jiffies + msecs_to_jiffies(5);
unsigned long loops = msecs_to_loops(5);

pr_debug("Entered %s\n", __func__);

while (1) {
while (--loops) {
iiscon = readl(i2s->regs + S3C2412_IISCON);
if (iiscon & S3C2412_IISCON_LRINDEX)
break;

if (timeout < jiffies) {
printk(KERN_ERR "%s: timeout\n", __func__);
return -ETIMEDOUT;
}
cpu_relax();
}

if (!loops) {
printk(KERN_ERR "%s: timeout\n", __func__);
return -ETIMEDOUT;
}

return 0;
Expand Down

0 comments on commit fa68e00

Please sign in to comment.