mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
[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: Rene Herman <rene.herman@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
parent
51c80cb65f
commit
90cf9b8532
@ -229,16 +229,15 @@ static void snd_ad1848_mce_down(struct snd_ad1848 *chip)
|
||||
spin_unlock_irqrestore(&chip->reg_lock, flags);
|
||||
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) {
|
||||
snd_printd("mce_down - auto calibration time out (1)\n");
|
||||
spin_unlock_irqrestore(&chip->reg_lock, flags);
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Wait for (possible -- during init auto-calibration may not be set)
|
||||
* calibration process to start. Needs upto 5 sample periods on AD1848
|
||||
* which at the slowest possible rate of 5.5125 kHz means 907 us.
|
||||
*/
|
||||
msleep(1);
|
||||
#if 0
|
||||
printk("(2) timeout = %i, jiffies = %li\n", timeout, jiffies);
|
||||
printk("(2) jiffies = %li\n", jiffies);
|
||||
#endif
|
||||
time = HZ / 4;
|
||||
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)
|
||||
}
|
||||
snd_cs4231_busy_wait(chip);
|
||||
|
||||
/* calibration process */
|
||||
|
||||
for (timeout = 500; timeout > 0 && (snd_cs4231_in(chip, CS4231_TEST_INIT) & CS4231_CALIB_IN_PROGRESS) == 0; timeout--)
|
||||
udelay(10);
|
||||
if ((snd_cs4231_in(chip, CS4231_TEST_INIT) & CS4231_CALIB_IN_PROGRESS) == 0) {
|
||||
snd_printd("cs4231_mce_down - auto calibration time out (1)\n");
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Wait for (possible -- during init auto-calibration may not be set)
|
||||
* calibration process to start. Needs upto 5 sample periods on AD1848
|
||||
* which at the slowest possible rate of 5.5125 kHz means 907 us.
|
||||
*/
|
||||
msleep(1);
|
||||
#if 0
|
||||
printk("(2) timeout = %i, jiffies = %li\n", timeout, jiffies);
|
||||
printk("(2) jiffies = %li\n", jiffies);
|
||||
#endif
|
||||
/* in 10 ms increments, check condition, up to 250 ms */
|
||||
timeout = 25;
|
||||
|
Loading…
Reference in New Issue
Block a user