mirror of https://gitee.com/openkylin/linux.git
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:
parent
2db3002029
commit
fe4af1b55e
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue