提交 b875d650 编写于 作者: T Takashi Iwai 提交者: Jaroslav Kysela

[ALSA] Fix thinko in cs4231 mce down check

The last patches to replace with schedule_timeout() don't work as expected.
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
Signed-off-by: NJaroslav Kysela <perex@suse.cz>
上级 56f91585
...@@ -313,6 +313,7 @@ void snd_cs4231_mce_up(struct snd_cs4231 *chip) ...@@ -313,6 +313,7 @@ void snd_cs4231_mce_up(struct snd_cs4231 *chip)
void snd_cs4231_mce_down(struct snd_cs4231 *chip) void snd_cs4231_mce_down(struct snd_cs4231 *chip)
{ {
unsigned long flags; unsigned long flags;
unsigned long end_time;
int timeout; int timeout;
snd_cs4231_busy_wait(chip); snd_cs4231_busy_wait(chip);
...@@ -344,28 +345,28 @@ void snd_cs4231_mce_down(struct snd_cs4231 *chip) ...@@ -344,28 +345,28 @@ void snd_cs4231_mce_down(struct snd_cs4231 *chip)
snd_printdd("(1) jiffies = %lu\n", jiffies); snd_printdd("(1) jiffies = %lu\n", jiffies);
/* check condition up to 250 ms */ /* check condition up to 250 ms */
timeout = msecs_to_jiffies(250); end_time = jiffies + msecs_to_jiffies(250);
while (snd_cs4231_in(chip, CS4231_TEST_INIT) & while (snd_cs4231_in(chip, CS4231_TEST_INIT) &
CS4231_CALIB_IN_PROGRESS) { CS4231_CALIB_IN_PROGRESS) {
if (timeout <= 0) { if (time_after(jiffies, end_time)) {
snd_printk(KERN_ERR "mce_down - " snd_printk(KERN_ERR "mce_down - "
"auto calibration time out (2)\n"); "auto calibration time out (2)\n");
return; return;
} }
timeout = schedule_timeout(timeout); msleep(1);
} }
snd_printdd("(2) jiffies = %lu\n", jiffies); snd_printdd("(2) jiffies = %lu\n", jiffies);
/* check condition up to 100 ms */ /* check condition up to 100 ms */
timeout = msecs_to_jiffies(100); end_time = jiffies + msecs_to_jiffies(100);
while (cs4231_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) { while (cs4231_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) {
if (timeout <= 0) { if (time_after(jiffies, end_time)) {
snd_printk(KERN_ERR "mce_down - auto calibration time out (3)\n"); snd_printk(KERN_ERR "mce_down - auto calibration time out (3)\n");
return; return;
} }
timeout = schedule_timeout(timeout); msleep(1);
} }
snd_printdd("(3) jiffies = %lu\n", jiffies); snd_printdd("(3) jiffies = %lu\n", jiffies);
......
...@@ -401,6 +401,7 @@ static void snd_cs4231_mce_up(struct snd_cs4231 *chip) ...@@ -401,6 +401,7 @@ static void snd_cs4231_mce_up(struct snd_cs4231 *chip)
static void snd_cs4231_mce_down(struct snd_cs4231 *chip) static void snd_cs4231_mce_down(struct snd_cs4231 *chip)
{ {
unsigned long flags; unsigned long flags;
unsigned long end_time;
int timeout; int timeout;
spin_lock_irqsave(&chip->lock, flags); spin_lock_irqsave(&chip->lock, flags);
...@@ -431,30 +432,30 @@ static void snd_cs4231_mce_down(struct snd_cs4231 *chip) ...@@ -431,30 +432,30 @@ static void snd_cs4231_mce_down(struct snd_cs4231 *chip)
msleep(1); msleep(1);
/* check condition up to 250ms */ /* check condition up to 250ms */
timeout = msecs_to_jiffies(250); end_time = jiffies + msecs_to_jiffies(250);
while (snd_cs4231_in(chip, CS4231_TEST_INIT) & while (snd_cs4231_in(chip, CS4231_TEST_INIT) &
CS4231_CALIB_IN_PROGRESS) { CS4231_CALIB_IN_PROGRESS) {
spin_unlock_irqrestore(&chip->lock, flags); spin_unlock_irqrestore(&chip->lock, flags);
if (timeout <= 0) { if (time_after(jiffies, end_time)) {
snd_printk("mce_down - " snd_printk("mce_down - "
"auto calibration time out (2)\n"); "auto calibration time out (2)\n");
return; return;
} }
timeout = schedule_timeout(timeout); msleep(1);
spin_lock_irqsave(&chip->lock, flags); spin_lock_irqsave(&chip->lock, flags);
} }
/* check condition up to 100ms */ /* check condition up to 100ms */
timeout = msecs_to_jiffies(100); end_time = jiffies + msecs_to_jiffies(100);
while (__cs4231_readb(chip, CS4231U(chip, REGSEL)) & CS4231_INIT) { while (__cs4231_readb(chip, CS4231U(chip, REGSEL)) & CS4231_INIT) {
spin_unlock_irqrestore(&chip->lock, flags); spin_unlock_irqrestore(&chip->lock, flags);
if (timeout <= 0) { if (time_after(jiffies, end_time)) {
snd_printk("mce_down - " snd_printk("mce_down - "
"auto calibration time out (3)\n"); "auto calibration time out (3)\n");
return; return;
} }
timeout = schedule_timeout(timeout); msleep(1);
spin_lock_irqsave(&chip->lock, flags); spin_lock_irqsave(&chip->lock, flags);
} }
spin_unlock_irqrestore(&chip->lock, flags); spin_unlock_irqrestore(&chip->lock, flags);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册