diff options
| author | Wan ZongShun <mcuos.com@gmail.com> | 2010-06-02 02:02:33 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-06-02 06:47:06 -0400 |
| commit | 8dfb0c78157e14387f49fa7ab425e65a93b2fee2 (patch) | |
| tree | 939e5783b304ae5b9489783e23ba33bc05a8bd3c /sound/soc/nuc900/nuc900-ac97.c | |
| parent | 018334c045c95793ab58948fe1f63282459c4f8d (diff) | |
ASoC: nuc900: fix a wait loop bug
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>
Diffstat (limited to 'sound/soc/nuc900/nuc900-ac97.c')
| -rw-r--r-- | sound/soc/nuc900/nuc900-ac97.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/sound/soc/nuc900/nuc900-ac97.c b/sound/soc/nuc900/nuc900-ac97.c index e1634a2f1701..c49a7934a7b2 100644 --- a/sound/soc/nuc900/nuc900-ac97.c +++ b/sound/soc/nuc900/nuc900-ac97.c | |||
| @@ -66,9 +66,8 @@ static unsigned short nuc900_ac97_read(struct snd_ac97 *ac97, | |||
| 66 | udelay(100); | 66 | udelay(100); |
| 67 | 67 | ||
| 68 | /* polling the AC_R_FINISH */ | 68 | /* polling the AC_R_FINISH */ |
| 69 | val = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); | 69 | while (!(AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_R_FINISH) |
| 70 | val &= AC_R_FINISH; | 70 | && timeout--) |
| 71 | while (!val && timeout--) | ||
| 72 | mdelay(1); | 71 | mdelay(1); |
| 73 | 72 | ||
| 74 | if (!timeout) { | 73 | if (!timeout) { |
| @@ -121,9 +120,8 @@ static void nuc900_ac97_write(struct snd_ac97 *ac97, unsigned short reg, | |||
| 121 | udelay(100); | 120 | udelay(100); |
| 122 | 121 | ||
| 123 | /* polling the AC_W_FINISH */ | 122 | /* polling the AC_W_FINISH */ |
| 124 | tmp = AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON); | 123 | while ((AUDIO_READ(nuc900_audio->mmio + ACTL_ACCON) & AC_W_FINISH) |
| 125 | tmp &= AC_W_FINISH; | 124 | && timeout--) |
| 126 | while (tmp && timeout--) | ||
| 127 | mdelay(1); | 125 | mdelay(1); |
| 128 | 126 | ||
| 129 | if (!timeout) | 127 | if (!timeout) |
