Also protect the call of lola_update_rirb() with spinlock.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
{
unsigned long timeout;
+ again:
timeout = jiffies + msecs_to_jiffies(1000);
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) {
*val = chip->res;
if (extval)
break;
udelay(20);
cond_resched();
- lola_update_rirb(chip);
}
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;
}
unsigned int sample_rate_max;
/* flags */
- unsigned int initialized :1;
- unsigned int cold_reset :1;
+ unsigned int initialized:1;
+ unsigned int cold_reset:1;
+ unsigned int polling_mode:1;
/* for debugging */
unsigned int debug_res;