Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe4af1b5 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: lola - Implement polling_mode like hd-audio



Also protect the call of lola_update_rirb() with spinlock.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 2db30020
Loading
Loading
Loading
Loading
+11 −1
Original line number Original line Diff line number Diff line
@@ -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;
}
}


+3 −2
Original line number Original line Diff line number Diff line
@@ -376,6 +376,7 @@ struct lola {
	/* 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;