--- rme9652.c Tue Apr 15 09:40:41 2003 +++ rme9652.c.jhall Tue Apr 15 09:37:15 2003 @@ -214,6 +214,7 @@ int dev; spinlock_t lock; + spinlock_t *dev_lock; int irq; unsigned long port; struct resource *res_port; @@ -1950,13 +1951,13 @@ void snd_rme9652_interrupt(int irq, void *dev_id, struct pt_regs *regs) { rme9652_t *rme9652 = (rme9652_t *) dev_id; + unsigned long flags; if (!(rme9652_read(rme9652, RME9652_status_register) & RME9652_IRQ)) { return; } - rme9652_write(rme9652, RME9652_irq_clear, 0); - + spin_lock_irqsave(rme9652->dev_lock, flags); if (rme9652->capture_substream) { snd_pcm_period_elapsed(rme9652->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); } @@ -1964,6 +1965,8 @@ if (rme9652->playback_substream) { snd_pcm_period_elapsed(rme9652->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream); } + spin_unlock_irqrestore(rme9652->dev_lock, flags); + rme9652_write(rme9652, RME9652_irq_clear, 0); } static snd_pcm_uframes_t snd_rme9652_hw_pointer(snd_pcm_substream_t *substream) @@ -2674,6 +2677,7 @@ { static int dev; rme9652_t *rme9652; + static spinlock_t dev_lock; snd_card_t *card; int err; @@ -2693,6 +2697,9 @@ rme9652 = (rme9652_t *) card->private_data; card->private_free = snd_rme9652_card_free; rme9652->dev = dev; + if (!dev) + spin_lock_init(&dev_lock); + rme9652->dev_lock = &dev_lock; rme9652->pci = pci; if ((err = snd_rme9652_create(card, rme9652, precise_ptr[dev])) < 0) {