ALSA: lola - Implement polling_mode like hd-audio

Also protect the call of lola_update_rirb() with spinlock.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2011-05-03 17:06:53 +02:00
parent 2db3002029
commit fe4af1b55e
2 changed files with 14 additions and 3 deletions

View File

@ -153,8 +153,14 @@ static int rirb_get_response(struct lola *chip, unsigned int *val,
{ {
unsigned long timeout; unsigned long timeout;
again:
timeout = jiffies + msecs_to_jiffies(1000); timeout = jiffies + msecs_to_jiffies(1000);
for (;;) { for (;;) {
if (chip->polling_mode) {
spin_lock_irq(&chip->reg_lock);
lola_update_rirb(chip);
spin_unlock_irq(&chip->reg_lock);
}
if (!chip->rirb.cmds) { if (!chip->rirb.cmds) {
*val = chip->res; *val = chip->res;
if (extval) if (extval)
@ -175,9 +181,13 @@ static int rirb_get_response(struct lola *chip, unsigned int *val,
break; break;
udelay(20); udelay(20);
cond_resched(); cond_resched();
lola_update_rirb(chip);
} }
printk(KERN_WARNING SFX "RIRB response error\n"); printk(KERN_WARNING SFX "RIRB response error\n");
if (!chip->polling_mode) {
printk(KERN_WARNING SFX "switching to polling mode\n");
chip->polling_mode = 1;
goto again;
}
return -EIO; return -EIO;
} }

View File

@ -374,8 +374,9 @@ struct lola {
unsigned int sample_rate_max; unsigned int sample_rate_max;
/* flags */ /* flags */
unsigned int initialized :1; unsigned int initialized:1;
unsigned int cold_reset :1; unsigned int cold_reset:1;
unsigned int polling_mode:1;
/* for debugging */ /* for debugging */
unsigned int debug_res; unsigned int debug_res;