--- rme9652.c.jhall Tue Apr 15 09:37:15 2003 +++ rme9652.c Tue Apr 15 18:25:48 2003 @@ -214,7 +214,7 @@ int dev; spinlock_t lock; - spinlock_t *dev_lock; + struct tasklet_struct interrupt_tasklet; int irq; unsigned long port; struct resource *res_port; @@ -326,6 +326,8 @@ MODULE_DEVICE_TABLE(pci, snd_rme9652_ids); +void rme9652_interrupt_tasklet(unsigned long arg); + static inline void rme9652_write(rme9652_t *rme9652, int reg, int val) { writel(val, rme9652->iobase + reg); @@ -1951,13 +1953,20 @@ 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; } - spin_lock_irqsave(rme9652->dev_lock, flags); + tasklet_hi_schedule(&rme9652->interrupt_tasklet); + rme9652_write(rme9652, RME9652_irq_clear, 0); +} + +void +rme9652_interrupt_tasklet(unsigned long arg) +{ + rme9652_t *rme9652 = (rme9652_t*)arg; + if (rme9652->capture_substream) { snd_pcm_period_elapsed(rme9652->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); } @@ -1965,8 +1974,6 @@ 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) @@ -2560,6 +2567,7 @@ return err; spin_lock_init(&rme9652->lock); + tasklet_init(&rme9652->interrupt_tasklet, rme9652_interrupt_tasklet, (unsigned long) rme9652); rme9652->port = pci_resource_start(pci, 0); if ((rme9652->res_port = request_mem_region(rme9652->port, RME9652_IO_EXTENT, "rme9652")) == NULL) { @@ -2677,7 +2685,6 @@ { static int dev; rme9652_t *rme9652; - static spinlock_t dev_lock; snd_card_t *card; int err; @@ -2697,9 +2704,6 @@ 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) {