Commit 90cf9b85 authored by Rene Herman's avatar Rene Herman Committed by Jaroslav Kysela

[ALSA] ad1838/cs4231 - fix MCE timeout upon initial load

When the ad1848/cs2431 is first being initialized, auto-calibration may not
be set causing a timeout waiting for it in snd_ad1848/cs4231_mce_down().
This has no dire consequences other than an alarming printk, but since what
we need to wait for is for the calibration to _finish_, let's just check for
that instead.
The early chips need a slight delay (as commented -- 5 sample periods) to be
sure that _if_ calibration is going to happen, it has started when we check
While the CS4231A datasheet implies it'll happen immediately on downing MCE,
some testing is showing that there's a window there as well, so just do the
delay everywhere.
Thanks to Krysztof Helt for pinpointing this problem.
Signed-off-by: default avatarRene Herman <rene.herman@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent 51c80cb6
...@@ -229,16 +229,15 @@ static void snd_ad1848_mce_down(struct snd_ad1848 *chip) ...@@ -229,16 +229,15 @@ static void snd_ad1848_mce_down(struct snd_ad1848 *chip)
spin_unlock_irqrestore(&chip->reg_lock, flags); spin_unlock_irqrestore(&chip->reg_lock, flags);
return; return;
} }
/* calibration process */
for (timeout = 500; timeout > 0 && (snd_ad1848_in(chip, AD1848_TEST_INIT) & AD1848_CALIB_IN_PROGRESS) == 0; timeout--); /*
if ((snd_ad1848_in(chip, AD1848_TEST_INIT) & AD1848_CALIB_IN_PROGRESS) == 0) { * Wait for (possible -- during init auto-calibration may not be set)
snd_printd("mce_down - auto calibration time out (1)\n"); * calibration process to start. Needs upto 5 sample periods on AD1848
spin_unlock_irqrestore(&chip->reg_lock, flags); * which at the slowest possible rate of 5.5125 kHz means 907 us.
return; */
} msleep(1);
#if 0 #if 0
printk("(2) timeout = %i, jiffies = %li\n", timeout, jiffies); printk("(2) jiffies = %li\n", jiffies);
#endif #endif
time = HZ / 4; time = HZ / 4;
while (snd_ad1848_in(chip, AD1848_TEST_INIT) & AD1848_CALIB_IN_PROGRESS) { while (snd_ad1848_in(chip, AD1848_TEST_INIT) & AD1848_CALIB_IN_PROGRESS) {
......
...@@ -336,16 +336,14 @@ void snd_cs4231_mce_down(struct snd_cs4231 *chip) ...@@ -336,16 +336,14 @@ void snd_cs4231_mce_down(struct snd_cs4231 *chip)
} }
snd_cs4231_busy_wait(chip); snd_cs4231_busy_wait(chip);
/* calibration process */ /*
* Wait for (possible -- during init auto-calibration may not be set)
for (timeout = 500; timeout > 0 && (snd_cs4231_in(chip, CS4231_TEST_INIT) & CS4231_CALIB_IN_PROGRESS) == 0; timeout--) * calibration process to start. Needs upto 5 sample periods on AD1848
udelay(10); * which at the slowest possible rate of 5.5125 kHz means 907 us.
if ((snd_cs4231_in(chip, CS4231_TEST_INIT) & CS4231_CALIB_IN_PROGRESS) == 0) { */
snd_printd("cs4231_mce_down - auto calibration time out (1)\n"); msleep(1);
return;
}
#if 0 #if 0
printk("(2) timeout = %i, jiffies = %li\n", timeout, jiffies); printk("(2) jiffies = %li\n", jiffies);
#endif #endif
/* in 10 ms increments, check condition, up to 250 ms */ /* in 10 ms increments, check condition, up to 250 ms */
timeout = 25; timeout = 25;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment