OSDN Git Service

ALSA: lola - Implement polling_mode like hd-audio
authorTakashi Iwai <tiwai@suse.de>
Tue, 3 May 2011 15:06:53 +0000 (17:06 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 3 May 2011 15:06:53 +0000 (17:06 +0200)
Also protect the call of lola_update_rirb() with spinlock.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/lola/lola.c
sound/pci/lola/lola.h

index 8ee22be..34b2428 100644 (file)
@@ -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;
 }
 
index 400ab5e..d5708e2 100644 (file)
@@ -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;