struct aaci_runtime *aacirun)
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
-       int ret;
+       int ret = 0;
 
        aacirun->substream = substream;
        runtime->private_data = aacirun;
         */
        runtime->hw.fifo_size = aaci->fifosize * 2;
 
-       ret = request_irq(aaci->dev->irq[0], aaci_irq, IRQF_SHARED|IRQF_DISABLED,
-                         DRIVER_NAME, aaci);
-       if (ret)
-               goto out;
-
-       return 0;
+       mutex_lock(&aaci->irq_lock);
+       if (!aaci->users++) {
+               ret = request_irq(aaci->dev->irq[0], aaci_irq,
+                          IRQF_SHARED | IRQF_DISABLED, DRIVER_NAME, aaci);
+               if (ret != 0)
+                       aaci->users--;
+       }
+       mutex_unlock(&aaci->irq_lock);
 
- out:
        return ret;
 }
 
        WARN_ON(aacirun->cr & CR_EN);
 
        aacirun->substream = NULL;
-       free_irq(aaci->dev->irq[0], aaci);
+
+       mutex_lock(&aaci->irq_lock);
+       if (!--aaci->users)
+               free_irq(aaci->dev->irq[0], aaci);
+       mutex_unlock(&aaci->irq_lock);
 
        return 0;
 }
 
        aaci = card->private_data;
        mutex_init(&aaci->ac97_sem);
+       mutex_init(&aaci->irq_lock);
        aaci->card = card;
        aaci->dev = dev;