瀏覽代碼

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>
Takashi Iwai 14 年之前
父節點
當前提交
fe4af1b55e
共有 2 個文件被更改,包括 14 次插入3 次删除
  1. 11 1
      sound/pci/lola/lola.c
  2. 3 2
      sound/pci/lola/lola.h

+ 11 - 1
sound/pci/lola/lola.c

@@ -153,8 +153,14 @@ static int rirb_get_response(struct lola *chip, unsigned int *val,
 {
 	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)
@@ -175,9 +181,13 @@ static int rirb_get_response(struct lola *chip, unsigned int *val,
 			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;
 }
 

+ 3 - 2
sound/pci/lola/lola.h

@@ -374,8 +374,9 @@ struct lola {
 	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;