ASoC: nuc900: fix a wait loop bug
authorWan ZongShun <mcuos.com@gmail.com>
Wed, 2 Jun 2010 06:02:33 +0000 (14:02 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 2 Jun 2010 10:47:06 +0000 (11:47 +0100)
The current implement meant ACTL_ACCON was only accessed once when read or write
proceeding, which is not right, if so,we have to wait the 'timeout=0x10000' to end
every times.

We need to polling the bit AC_R_FINISH and AC_W_FINISH of ACTL_ACCON
register to identify whether read or write is finished or not,so I make
the patch to fix the issue.

Signed-off-by: Wan ZongShun <mcuos.com@gmail.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/nuc900/nuc900-ac97.c

index e1634a2..c49a793 100644 (file)
@@ -66,9 +66,8 @@ static unsigned short nuc900_ac97_read(struct snd_ac97 *ac97,
        udelay(100);
 
        /* polling the AC_R_FINISH */
-       val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON);
-       val &= AC_R_FINISH;
-       while (!val && timeout--)
+       while (!(AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_R_FINISH)
+                                                               && timeout--)
                mdelay(1);
 
        if (!timeout) {
@@ -121,9 +120,8 @@ static void nuc900_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
        udelay(100);
 
        /* polling the AC_W_FINISH */
-       tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON);
-       tmp &= AC_W_FINISH;
-       while (tmp && timeout--)
+       while ((AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_W_FINISH)
+                                                               && timeout--)
                mdelay(1);
 
        if (!timeout)