From 0246417de28749b5d8feeb62a12d6752e90777dd Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 20 Apr 2003 20:18:53 -0700 Subject: [PATCH] [PATCH] irqs in sound/ Updates all sound drivers to the new IRQ API. The patch also fixes - a return-with-lock-held - a bunch of warnings and 64-bit bugs (CPU flags must be held in an unsigned long) - jiffies must use unsigned longs - two functions returning uninitialised values --- include/sound/ad1848.h | 3 ++- include/sound/cs4231.h | 2 +- include/sound/emu10k1.h | 3 ++- include/sound/es1688.h | 3 ++- include/sound/gus.h | 4 ++-- include/sound/initval.h | 3 ++- include/sound/mpu401.h | 1 + include/sound/sb.h | 7 ++++--- sound/drivers/mtpav.c | 3 ++- sound/drivers/serial-u16550.c | 5 +++-- sound/isa/ad1816a/ad1816a_lib.c | 3 ++- sound/isa/ad1848/ad1848_lib.c | 3 ++- sound/isa/cs423x/cs4231_lib.c | 3 ++- sound/isa/es1688/es1688_lib.c | 3 ++- sound/isa/es18xx.c | 5 ++--- sound/isa/gus/gus_irq.c | 11 ++++++---- sound/isa/gus/gusmax.c | 6 +++++- sound/isa/gus/interwave.c | 6 +++++- sound/isa/opl3sa2.c | 19 ++++++++++++----- sound/isa/opti9xx/opti92x-ad1848.c | 3 ++- sound/isa/sb/sb16_main.c | 3 ++- sound/isa/sb/sb8.c | 3 ++- sound/isa/sb/sb_common.c | 2 +- sound/isa/sgalaxy.c | 3 ++- sound/isa/wavefront/wavefront.c | 5 +++-- sound/oss/ad1816.c | 7 ++++--- sound/oss/ad1848.c | 3 ++- sound/oss/ad1848.h | 4 +++- sound/oss/btaudio.c | 8 +++++--- sound/oss/cmpci.c | 5 +++-- sound/oss/cs4281/cs4281m.c | 5 +++-- sound/oss/cs46xx.c | 5 +++-- sound/oss/dmasound/dmasound_atari.c | 11 +++++----- sound/oss/dmasound/dmasound_awacs.c | 27 +++++++++++++++--------- sound/oss/dmasound/dmasound_paula.c | 7 ++++--- sound/oss/dmasound/dmasound_q40.c | 10 +++++---- sound/oss/emu10k1/cardwo.c | 2 +- sound/oss/emu10k1/irqmgr.c | 7 +++++-- sound/oss/emu10k1/main.c | 2 +- sound/oss/es1370.c | 5 +++-- sound/oss/es1371.c | 5 +++-- sound/oss/esssolo1.c | 5 +++-- sound/oss/gus.h | 2 +- sound/oss/gus_card.c | 10 +++++---- sound/oss/gus_wave.c | 6 +++--- sound/oss/i810_audio.c | 5 +++-- sound/oss/ite8172.c | 9 +++++--- sound/oss/maestro.c | 8 +++++--- sound/oss/maestro3.c | 8 +++++--- sound/oss/maui.c | 3 ++- sound/oss/mpu401.c | 9 +++++--- sound/oss/mpu401.h | 4 ++-- sound/oss/msnd_pinnacle.c | 4 +++- sound/oss/nec_vrc5477.c | 3 ++- sound/oss/nm256.h | 4 +++- sound/oss/nm256_audio.c | 32 +++++++++++++++++++++-------- sound/oss/pas2_card.c | 3 ++- sound/oss/pss.c | 5 +++-- sound/oss/rme96xx.c | 9 ++++---- sound/oss/sb_common.c | 3 ++- sound/oss/sonicvibes.c | 5 +++-- sound/oss/trident.c | 5 +++-- sound/oss/uart401.c | 5 +++-- sound/oss/uart6850.c | 3 ++- sound/oss/via82cxxx_audio.c | 24 +++++++++++++++------- sound/oss/vidc.h | 2 +- sound/oss/vidc_fill.S | 4 ++++ sound/oss/vwsnd.c | 3 ++- sound/oss/waveartist.c | 3 ++- sound/oss/wavfront.c | 7 ++++--- sound/oss/wf_midi.c | 10 +++++---- sound/oss/ymfpci.c | 3 ++- sound/pci/ali5451/ali5451.c | 5 +++-- sound/pci/als4000.c | 3 ++- sound/pci/cmipci.c | 5 +++-- sound/pci/cs4281.c | 9 ++++---- sound/pci/cs46xx/cs46xx_lib.c | 5 +++-- sound/pci/emu10k1/irq.c | 5 ++++- sound/pci/es1938.c | 13 +++++++++--- sound/pci/es1968.c | 7 ++++--- sound/pci/fm801.c | 5 +++-- sound/pci/ice1712/ice1712.c | 5 ++++- sound/pci/ice1712/ice1724.c | 7 +++++-- sound/pci/korg1212/korg1212.c | 7 ++++--- sound/pci/maestro3.c | 5 +++-- sound/pci/nm256/nm256.c | 12 ++++++----- sound/pci/rme32.c | 5 +++-- sound/pci/rme96.c | 5 +++-- sound/pci/rme9652/hdsp.c | 5 +++-- sound/pci/rme9652/rme9652.c | 5 +++-- sound/pci/sonicvibes.c | 7 ++++--- sound/pci/trident/trident_main.c | 7 ++++--- sound/pci/via82xx.c | 7 ++++--- sound/pci/ymfpci/ymfpci_main.c | 3 ++- sound/ppc/pmac.c | 9 +++++--- sound/ppc/tumbler.c | 7 +++++-- sound/sparc/amd7930.c | 3 ++- sound/sparc/cs4231.c | 5 +++-- 98 files changed, 380 insertions(+), 212 deletions(-) diff --git a/include/sound/ad1848.h b/include/sound/ad1848.h index 155fa2b6ec0f9..55be82f4599b5 100644 --- a/include/sound/ad1848.h +++ b/include/sound/ad1848.h @@ -23,6 +23,7 @@ */ #include "pcm.h" +#include /* IO ports */ @@ -163,7 +164,7 @@ int snd_ad1848_create(snd_card_t * card, int snd_ad1848_pcm(ad1848_t * chip, int device, snd_pcm_t **rpcm); const snd_pcm_ops_t *snd_ad1848_get_pcm_ops(int direction); int snd_ad1848_mixer(ad1848_t * chip); -void snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs); /* exported mixer stuffs */ enum { AD1848_MIX_SINGLE, AD1848_MIX_DOUBLE, AD1848_MIX_CAPTURE }; diff --git a/include/sound/cs4231.h b/include/sound/cs4231.h index 75d1b588ee87f..af643468893fc 100644 --- a/include/sound/cs4231.h +++ b/include/sound/cs4231.h @@ -316,7 +316,7 @@ unsigned char snd_cs4236_ext_in(cs4231_t *chip, unsigned char reg); void snd_cs4231_mce_up(cs4231_t *chip); void snd_cs4231_mce_down(cs4231_t *chip); -void snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs); const char *snd_cs4231_chip_id(cs4231_t *chip); diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h index 4161dfd1f2b3a..73b0b39352752 100644 --- a/include/sound/emu10k1.h +++ b/include/sound/emu10k1.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #ifndef PCI_VENDOR_ID_CREATIVE @@ -1014,7 +1015,7 @@ int snd_emu10k1_fx8010_pcm(emu10k1_t * emu, int device, snd_pcm_t ** rpcm); int snd_emu10k1_mixer(emu10k1_t * emu); int snd_emu10k1_fx8010_new(emu10k1_t *emu, int device, snd_hwdep_t ** rhwdep); -void snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs); /* initialization */ void snd_emu10k1_voice_init(emu10k1_t * emu, int voice); diff --git a/include/sound/es1688.h b/include/sound/es1688.h index 40967507892c2..104bb9b022cc6 100644 --- a/include/sound/es1688.h +++ b/include/sound/es1688.h @@ -24,6 +24,7 @@ #include "control.h" #include "pcm.h" +#include #define ES1688_HW_AUTO 0x0000 #define ES1688_HW_688 0x0001 @@ -109,7 +110,7 @@ typedef struct _snd_es1688 es1688_t; void snd_es1688_mixer_write(es1688_t *chip, unsigned char reg, unsigned char data); unsigned char snd_es1688_mixer_read(es1688_t *chip, unsigned char reg); -void snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs); int snd_es1688_create(snd_card_t * card, unsigned long port, diff --git a/include/sound/gus.h b/include/sound/gus.h index a896bf9ff6260..6cd0a22527f4c 100644 --- a/include/sound/gus.h +++ b/include/sound/gus.h @@ -561,7 +561,7 @@ struct _SND_IW_LFO_PROGRAM { }; #if 0 -extern void snd_gf1_lfo_effect_interrupt(snd_gus_card_t * gus, snd_gf1_voice_t * voice); +extern irqreturn_t snd_gf1_lfo_effect_interrupt(snd_gus_card_t * gus, snd_gf1_voice_t * voice); #endif extern void snd_gf1_lfo_init(snd_gus_card_t * gus); extern void snd_gf1_lfo_done(snd_gus_card_t * gus); @@ -666,7 +666,7 @@ int snd_gus_initialize(snd_gus_card_t * gus); /* gus_irq.c */ -void snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs); #ifdef CONFIG_SND_DEBUG void snd_gus_irq_profile_init(snd_gus_card_t *gus); #endif diff --git a/include/sound/initval.h b/include/sound/initval.h index 016151a49a9bc..31e045d389b7b 100644 --- a/include/sound/initval.h +++ b/include/sound/initval.h @@ -100,8 +100,9 @@ static int snd_legacy_auto_probe(unsigned long *ports, int (*probe)(unsigned lon #ifdef SNDRV_LEGACY_FIND_FREE_IRQ #include -static void snd_legacy_empty_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_legacy_empty_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { + return IRQ_HANDLED; } static int snd_legacy_find_free_irq(int *irq_table) diff --git a/include/sound/mpu401.h b/include/sound/mpu401.h index 3ae91b26b0616..c5faba67aa267 100644 --- a/include/sound/mpu401.h +++ b/include/sound/mpu401.h @@ -23,6 +23,7 @@ */ #include "rawmidi.h" +#include #define MPU401_HW_MPU401 1 /* native MPU401 */ #define MPU401_HW_SB 2 /* SoundBlaster MPU-401 UART */ diff --git a/include/sound/sb.h b/include/sound/sb.h index 7815b9200d352..aa7d892912aa9 100644 --- a/include/sound/sb.h +++ b/include/sound/sb.h @@ -24,6 +24,7 @@ #include "pcm.h" #include "rawmidi.h" +#include #include enum sb_hw_type { @@ -99,7 +100,7 @@ struct _snd_sb { snd_rawmidi_t *rmidi; snd_rawmidi_substream_t *midi_substream_input; snd_rawmidi_substream_t *midi_substream_output; - void (*rmidi_callback)(int irq, void *dev_id, struct pt_regs *regs); + irqreturn_t (*rmidi_callback)(int irq, void *dev_id, struct pt_regs *regs); spinlock_t reg_lock; spinlock_t open_lock; @@ -282,7 +283,7 @@ int snd_sbdsp_reset(sb_t *chip); int snd_sbdsp_create(snd_card_t *card, unsigned long port, int irq, - void (*irq_handler)(int, void *, struct pt_regs *), + irqreturn_t (*irq_handler)(int, void *, struct pt_regs *), int dma8, int dma16, unsigned short hardware, sb_t **r_chip); @@ -308,7 +309,7 @@ int snd_sb16dsp_pcm(sb_t *chip, int device, snd_pcm_t ** rpcm); const snd_pcm_ops_t *snd_sb16dsp_get_pcm_ops(int direction); int snd_sb16dsp_configure(sb_t *chip); /* sb16.c */ -void snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs); +irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs); int snd_sb16_playback_open(snd_pcm_substream_t *substream); int snd_sb16_capture_open(snd_pcm_substream_t *substream); int snd_sb16_playback_close(snd_pcm_substream_t *substream); diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c index 4d4bf94ebf675..7ecd9d48007fe 100644 --- a/sound/drivers/mtpav.c +++ b/sound/drivers/mtpav.c @@ -585,7 +585,7 @@ static void snd_mtpav_read_bytes(mtpav_t * mcrd) } while (sbyt & SIGS_BYTE); } -static void snd_mtpav_irqh(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_mtpav_irqh(int irq, void *dev_id, struct pt_regs *regs) { mtpav_t *mcard = snd_magic_cast(mtpav_t, dev_id, return); @@ -593,6 +593,7 @@ static void snd_mtpav_irqh(int irq, void *dev_id, struct pt_regs *regs) spin_lock(&mcard->spinlock); snd_mtpav_read_bytes(mcard); spin_unlock(&mcard->spinlock); + return IRQ_HANDLED; } /* diff --git a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c index 299a68a68a042..2db217f54de02 100644 --- a/sound/drivers/serial-u16550.c +++ b/sound/drivers/serial-u16550.c @@ -290,7 +290,7 @@ static void snd_uart16550_io_loop(snd_uart16550_t * uart) * Note that some devices need OUT2 to be set before they will generate * interrupts at all. (Possibly tied to an internal pull-up on CTS?) */ -static void snd_uart16550_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_uart16550_interrupt(int irq, void *dev_id, struct pt_regs *regs) { snd_uart16550_t *uart; @@ -298,11 +298,12 @@ static void snd_uart16550_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_lock(&uart->open_lock); if (uart->filemode == SERIAL_MODE_NOT_OPENED) { spin_unlock(&uart->open_lock); - return; + return IRQ_NONE; } inb(uart->base + UART_IIR); /* indicate to the UART that the interrupt has been serviced */ snd_uart16550_io_loop(uart); spin_unlock(&uart->open_lock); + return IRQ_HANDLED; } /* When the polling mode, this function calls snd_uart16550_io_loop. */ diff --git a/sound/isa/ad1816a/ad1816a_lib.c b/sound/isa/ad1816a/ad1816a_lib.c index c962965545c17..b46eabb442410 100644 --- a/sound/isa/ad1816a/ad1816a_lib.c +++ b/sound/isa/ad1816a/ad1816a_lib.c @@ -311,7 +311,7 @@ static snd_pcm_uframes_t snd_ad1816a_capture_pointer(snd_pcm_substream_t *substr } -static void snd_ad1816a_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_ad1816a_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ad1816a_t *chip = snd_magic_cast(ad1816a_t, dev_id, return); unsigned char status; @@ -332,6 +332,7 @@ static void snd_ad1816a_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_lock(&chip->lock); snd_ad1816a_out(chip, AD1816A_INTERRUPT_STATUS, 0x00); spin_unlock(&chip->lock); + return IRQ_HANDLED; } diff --git a/sound/isa/ad1848/ad1848_lib.c b/sound/isa/ad1848/ad1848_lib.c index 840c448079f98..ed6a66d4e0826 100644 --- a/sound/isa/ad1848/ad1848_lib.c +++ b/sound/isa/ad1848/ad1848_lib.c @@ -585,7 +585,7 @@ static int snd_ad1848_capture_prepare(snd_pcm_substream_t * substream) return 0; } -void snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ad1848_t *chip = snd_magic_cast(ad1848_t, dev_id, return); @@ -596,6 +596,7 @@ void snd_ad1848_interrupt(int irq, void *dev_id, struct pt_regs *regs) (chip->mode & AD1848_MODE_RUNNING)) snd_pcm_period_elapsed(chip->capture_substream); outb(0, AD1848P(chip, STATUS)); /* clear global interrupt bit */ + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_ad1848_playback_pointer(snd_pcm_substream_t * substream) diff --git a/sound/isa/cs423x/cs4231_lib.c b/sound/isa/cs423x/cs4231_lib.c index cadcaa1a95a44..70feb9cfa4823 100644 --- a/sound/isa/cs423x/cs4231_lib.c +++ b/sound/isa/cs423x/cs4231_lib.c @@ -967,7 +967,7 @@ static void snd_cs4231_overrange(cs4231_t *chip) chip->capture_substream->runtime->overrange++; } -void snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs4231_t *chip = snd_magic_cast(cs4231_t, dev_id, return); unsigned char status; @@ -998,6 +998,7 @@ void snd_cs4231_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_lock(&chip->reg_lock); snd_cs4231_outm(chip, CS4231_IRQ_STATUS, ~CS4231_ALL_IRQS | ~status, 0); spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } #ifdef LEGACY_SUPPORT diff --git a/sound/isa/es1688/es1688_lib.c b/sound/isa/es1688/es1688_lib.c index 5d8ceba7a2e98..14dd8cf2296fc 100644 --- a/sound/isa/es1688/es1688_lib.c +++ b/sound/isa/es1688/es1688_lib.c @@ -482,7 +482,7 @@ static int snd_es1688_capture_trigger(snd_pcm_substream_t * substream, return snd_es1688_trigger(chip, cmd, 0x0f); } -void snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es1688_t *chip = snd_magic_cast(es1688_t, dev_id, return); @@ -492,6 +492,7 @@ void snd_es1688_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_pcm_period_elapsed(chip->capture_substream); inb(ES1688P(chip, DATA_AVAIL)); /* ack interrupt */ + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_es1688_playback_pointer(snd_pcm_substream_t * substream) diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c index 04f2c1834bfcc..d82cea50a0838 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c @@ -727,12 +727,11 @@ static int snd_es18xx_playback_trigger(snd_pcm_substream_t *substream, return snd_es18xx_playback2_trigger(chip, substream, cmd); } -static void snd_es18xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_es18xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es18xx_t *chip = snd_magic_cast(es18xx_t, dev_id, return); unsigned char status; - if (chip->caps & ES18XX_CONTROL) { /* Read Interrupt status */ status = inb(chip->ctrl_port + 6); @@ -787,7 +786,7 @@ static void snd_es18xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* ack interrupt */ snd_es18xx_mixer_write(chip, 0x66, 0x00); } - + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_es18xx_playback_pointer(snd_pcm_substream_t * substream) diff --git a/sound/isa/gus/gus_irq.c b/sound/isa/gus/gus_irq.c index 3ea4d76ca1012..83c919967e96e 100644 --- a/sound/isa/gus/gus_irq.c +++ b/sound/isa/gus/gus_irq.c @@ -30,16 +30,18 @@ #define STAT_ADD(x) while (0) { ; } #endif -void snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs) { snd_gus_card_t * gus = snd_magic_cast(snd_gus_card_t, dev_id, return); unsigned char status; int loop = 100; - - __again: + int handled = 0; + +__again: status = inb(gus->gf1.reg_irqstat); if (status == 0) - return; + return IRQ_RETVAL(handled); + handled = 1; // snd_printk("IRQ: status = 0x%x\n", status); if (status & 0x02) { STAT_ADD(gus->gf1.interrupt_stat_midi_in); @@ -101,6 +103,7 @@ void snd_gus_interrupt(int irq, void *dev_id, struct pt_regs *regs) } if (--loop > 0) goto __again; + return IRQ_NONE; } #ifdef CONFIG_SND_DEBUG diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c index 22cb9ac15cb9f..11a85a6154e8f 100644 --- a/sound/isa/gus/gusmax.c +++ b/sound/isa/gus/gusmax.c @@ -129,22 +129,26 @@ static int __init snd_gusmax_detect(snd_gus_card_t * gus) return 0; } -static void snd_gusmax_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_gusmax_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct snd_gusmax *maxcard = (struct snd_gusmax *) dev_id; int loop, max = 5; + int handled = 0; do { loop = 0; if (inb(maxcard->gus_status_reg)) { + handled = 1; snd_gus_interrupt(irq, maxcard->gus, regs); loop++; } if (inb(maxcard->pcm_status_reg) & 0x01) { /* IRQ bit is set? */ + handled = 1; snd_cs4231_interrupt(irq, maxcard->cs4231, regs); loop++; } } while (loop && --max > 0); + return IRQ_RETVAL(handled); } static void __init snd_gusmax_init(int dev, snd_card_t * card, snd_gus_card_t * gus) diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index d5e6c7fdc70b3..cbc5143e4e444 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c @@ -312,22 +312,26 @@ static int __devinit snd_interwave_detect(struct snd_interwave *iwcard, return -ENODEV; } -static void snd_interwave_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_interwave_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct snd_interwave *iwcard = (struct snd_interwave *) dev_id; int loop, max = 5; + int handled = 0; do { loop = 0; if (inb(iwcard->gus_status_reg)) { + handled = 1; snd_gus_interrupt(irq, iwcard->gus, regs); loop++; } if (inb(iwcard->pcm_status_reg) & 0x01) { /* IRQ bit is set? */ + handled = 1; snd_cs4231_interrupt(irq, iwcard->cs4231, regs); loop++; } } while (loop && --max > 0); + return IRQ_RETVAL(handled); } static void __devinit snd_interwave_reset(snd_gus_card_t * gus) diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c index feb12392be8eb..80530a3eacc9e 100644 --- a/sound/isa/opl3sa2.c +++ b/sound/isa/opl3sa2.c @@ -297,26 +297,34 @@ static int __init snd_opl3sa2_detect(opl3sa2_t *chip) return 0; } -static void snd_opl3sa2_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_opl3sa2_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned short status; opl3sa2_t *chip = snd_magic_cast(opl3sa2_t, dev_id, return); + int handled = 0; if (chip == NULL || chip->card == NULL) - return; + return IRQ_NONE; status = snd_opl3sa2_read(chip, OPL3SA2_IRQ_STATUS); - if (status & 0x20) + if (status & 0x20) { + handled = 1; snd_opl3_interrupt(chip->synth); + } - if ((status & 0x10) && chip->rmidi != NULL) + if ((status & 0x10) && chip->rmidi != NULL) { + handled = 1; snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); + } - if (status & 0x07) /* TI,CI,PI */ + if (status & 0x07) { /* TI,CI,PI */ + handled = 1; snd_cs4231_interrupt(irq, chip->cs4231, regs); + } if (status & 0x40) { /* hardware volume change */ + handled = 1; /* reading from Master Lch register at 0x07 clears this bit */ snd_opl3sa2_read(chip, OPL3SA2_MASTER_RIGHT); snd_opl3sa2_read(chip, OPL3SA2_MASTER_LEFT); @@ -325,6 +333,7 @@ static void snd_opl3sa2_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->master_volume->id); } } + return IRQ_RETVAL(handled); } #define OPL3SA2_SINGLE(xname, xindex, reg, shift, mask, invert) \ diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index f768fdfcaeb6e..be0e40a9ec44c 100644 --- a/sound/isa/opti9xx/opti92x-ad1848.c +++ b/sound/isa/opti9xx/opti92x-ad1848.c @@ -1125,7 +1125,7 @@ static void snd_opti93x_overrange(opti93x_t *chip) spin_unlock_irqrestore(&chip->lock, flags); } -void snd_opti93x_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_opti93x_interrupt(int irq, void *dev_id, struct pt_regs *regs) { opti93x_t *codec = snd_magic_cast(opti93x_t, dev_id, return); unsigned char status; @@ -1138,6 +1138,7 @@ void snd_opti93x_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_pcm_period_elapsed(codec->capture_substream); } outb(0x00, OPTi93X_PORT(codec, STATUS)); + return IRQ_HANDLED; } diff --git a/sound/isa/sb/sb16_main.c b/sound/isa/sb/sb16_main.c index 76b50b58618d4..1f991b49c46ff 100644 --- a/sound/isa/sb/sb16_main.c +++ b/sound/isa/sb/sb16_main.c @@ -393,7 +393,7 @@ static int snd_sb16_capture_trigger(snd_pcm_substream_t * substream, return result; } -void snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sb_t *chip = snd_magic_cast(sb_t, dev_id, return); unsigned char status; @@ -438,6 +438,7 @@ void snd_sb16dsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_sb_ack_16bit(chip); spin_unlock(&chip->reg_lock); } + return IRQ_HANDLED; } /* diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c index b9510381eb254..bc43e1da04f94 100644 --- a/sound/isa/sb/sb8.c +++ b/sound/isa/sb/sb8.c @@ -70,7 +70,7 @@ struct snd_sb8 { static snd_card_t *snd_sb8_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR; -static void snd_sb8_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_sb8_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sb_t *chip = snd_magic_cast(sb_t, dev_id, return); @@ -79,6 +79,7 @@ static void snd_sb8_interrupt(int irq, void *dev_id, struct pt_regs *regs) } else { snd_sb8dsp_midi_interrupt(chip); } + return IRQ_HANDLED; } static void snd_sb8_free(snd_card_t *card) diff --git a/sound/isa/sb/sb_common.c b/sound/isa/sb/sb_common.c index 1b32c915d0081..d7d56cb8db9cd 100644 --- a/sound/isa/sb/sb_common.c +++ b/sound/isa/sb/sb_common.c @@ -214,7 +214,7 @@ static int snd_sbdsp_dev_free(snd_device_t *device) int snd_sbdsp_create(snd_card_t *card, unsigned long port, int irq, - void (*irq_handler)(int, void *, struct pt_regs *), + irqreturn_t (*irq_handler)(int, void *, struct pt_regs *), int dma8, int dma16, unsigned short hardware, diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c index a67fc04dccd37..a7b00283ec4dc 100644 --- a/sound/isa/sgalaxy.c +++ b/sound/isa/sgalaxy.c @@ -112,8 +112,9 @@ static int __init snd_sgalaxy_sbdsp_command(unsigned long port, unsigned char va return 0; } -static void snd_sgalaxy_dummy_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_sgalaxy_dummy_interrupt(int irq, void *dev_id, struct pt_regs *regs) { + return IRQ_NONE; } static int __init snd_sgalaxy_setup_wss(unsigned long port, int irq, int dma) diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c index 30037dad49bb9..47a07e98cc9e2 100644 --- a/sound/isa/wavefront/wavefront.c +++ b/sound/isa/wavefront/wavefront.c @@ -276,7 +276,7 @@ snd_wavefront_pnp (int dev, snd_wavefront_card_t *acard, struct pnp_card_link *c #endif /* CONFIG_PNP */ -static void snd_wavefront_ics2115_interrupt(int irq, +static irqreturn_t snd_wavefront_ics2115_interrupt(int irq, void *dev_id, struct pt_regs *regs) { @@ -285,13 +285,14 @@ static void snd_wavefront_ics2115_interrupt(int irq, acard = (snd_wavefront_card_t *) dev_id; if (acard == NULL) - return; + return IRQ_NONE; if (acard->wavefront.interrupts_are_midi) { snd_wavefront_midi_interrupt (acard); } else { snd_wavefront_internal_interrupt (acard); } + return IRQ_HANDLED; } snd_hwdep_t * __devinit diff --git a/sound/oss/ad1816.c b/sound/oss/ad1816.c index fb48847ec29a6..90b687a4e9b15 100644 --- a/sound/oss/ad1816.c +++ b/sound/oss/ad1816.c @@ -540,7 +540,7 @@ static struct audio_driver ad1816_audio_driver = /* Interrupt handler */ -static void ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) { unsigned char status; ad1816_info *devc; @@ -549,7 +549,7 @@ static void ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) if (irq < 0 || irq > 15) { printk(KERN_WARNING "ad1816: Got bogus interrupt %d\n", irq); - return; + return IRQ_NONE; } dev = irq2dev[irq]; @@ -557,7 +557,7 @@ static void ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) if (dev < 0 || dev >= num_audiodevs) { printk(KERN_WARNING "ad1816: IRQ2AD1816-mapping failed for " "irq %d device %d\n", irq,dev); - return; + return IRQ_NONE; } devc = (ad1816_info *) audio_devs[dev]->devc; @@ -583,6 +583,7 @@ static void ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy) DMAbuf_outputintr (dev, 1); spin_unlock(&devc->lock); + return IRQ_HANDLED; } /* ------------------------------------------------------------------- */ diff --git a/sound/oss/ad1848.c b/sound/oss/ad1848.c index 2e13f47fe22ee..2ff9984287749 100644 --- a/sound/oss/ad1848.c +++ b/sound/oss/ad1848.c @@ -2212,7 +2212,7 @@ void ad1848_unload(int io_base, int irq, int dma_playback, int dma_capture, int printk(KERN_ERR "ad1848: Can't find device to be unloaded. Base=%x\n", io_base); } -void adintr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t adintr(int irq, void *dev_id, struct pt_regs *dummy) { unsigned char status; ad1848_info *devc; @@ -2287,6 +2287,7 @@ interrupt_again: /* Jump back here if int status doesn't reset */ { goto interrupt_again; } + return IRQ_HANDLED; } /* diff --git a/sound/oss/ad1848.h b/sound/oss/ad1848.h index 6791c2745ca12..76e3c6a1dd073 100644 --- a/sound/oss/ad1848.h +++ b/sound/oss/ad1848.h @@ -1,4 +1,6 @@ +#include + #define AD_F_CS4231 0x0001 /* Returned if a CS4232 (or compatible) detected */ #define AD_F_CS4248 0x0001 /* Returned if a CS4248 (or compatible) detected */ @@ -16,7 +18,7 @@ void ad1848_unload (int io_base, int irq, int dma_playback, int dma_capture, int int ad1848_detect (int io_base, int *flags, int *osp); int ad1848_control(int cmd, int arg); -void adintr(int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t adintr(int irq, void *dev_id, struct pt_regs * dummy); void attach_ms_sound(struct address_info * hw_config, struct module * owner); int probe_ms_sound(struct address_info *hw_config); diff --git a/sound/oss/btaudio.c b/sound/oss/btaudio.c index 6b380ea83d4e8..6f4d73666fa24 100644 --- a/sound/oss/btaudio.c +++ b/sound/oss/btaudio.c @@ -817,18 +817,20 @@ static char *irq_name[] = { "", "", "", "OFLOW", "", "", "", "", "", "", "", "RISCI", "FBUS", "FTRGT", "FDSR", "PPERR", "RIPERR", "PABORT", "OCERR", "SCERR" }; -static void btaudio_irq(int irq, void *dev_id, struct pt_regs * regs) +static irqreturn_t btaudio_irq(int irq, void *dev_id, struct pt_regs * regs) { int count = 0; u32 stat,astat; struct btaudio *bta = dev_id; + int handled = 0; for (;;) { count++; stat = btread(REG_INT_STAT); astat = stat & btread(REG_INT_MASK); if (!astat) - return; + return IRQ_RETVAL(handled); + handled = 1; btwrite(astat,REG_INT_STAT); if (irq_debug) { @@ -864,7 +866,7 @@ static void btaudio_irq(int irq, void *dev_id, struct pt_regs * regs) btwrite(0, REG_INT_MASK); } } - return; + return IRQ_NONE; } /* -------------------------------------------------------------- */ diff --git a/sound/oss/cmpci.c b/sound/oss/cmpci.c index fc323c40ee88b..a66c0da27289f 100644 --- a/sound/oss/cmpci.c +++ b/sound/oss/cmpci.c @@ -1156,7 +1156,7 @@ static void cm_handle_midi(struct cm_state *s) } #endif -static void cm_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t cm_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct cm_state *s = (struct cm_state *)dev_id; unsigned int intsrc, intstat; @@ -1165,7 +1165,7 @@ static void cm_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* fastpath out, to ease interrupt sharing */ intsrc = inl(s->iobase + CODEC_CMI_INT_STATUS); if (!(intsrc & 0x80000000)) - return; + return IRQ_NONE; spin_lock(&s->lock); intstat = inb(s->iobase + CODEC_CMI_INT_HLDCLR + 2); /* acknowledge interrupt */ @@ -1180,6 +1180,7 @@ static void cm_interrupt(int irq, void *dev_id, struct pt_regs *regs) cm_handle_midi(s); #endif spin_unlock(&s->lock); + return IRQ_HANDLED; } #ifdef CONFIG_SOUND_CMPCI_MIDI diff --git a/sound/oss/cs4281/cs4281m.c b/sound/oss/cs4281/cs4281m.c index 19b38dfd98acd..7d16e837e24ef 100644 --- a/sound/oss/cs4281/cs4281m.c +++ b/sound/oss/cs4281/cs4281m.c @@ -3792,7 +3792,7 @@ static void cs4281_handle_midi(struct cs4281_state *s) -static void cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct cs4281_state *s = (struct cs4281_state *) dev_id; unsigned int temp1; @@ -3809,7 +3809,7 @@ static void cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) writel(HICR_IEV | HICR_CHGM, s->pBA0 + BA0_HICR); CS_DBGOUT(CS_INTERRUPT, 9, printk(KERN_INFO "cs4281: cs4281_interrupt(): returning not cs4281 interrupt.\n")); - return; + return IRQ_NONE; } if (temp1 & HISR_DMA0) // If play interrupt, @@ -3823,6 +3823,7 @@ static void cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) cs4281_update_ptr(s,CS_TRUE); cs4281_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } // ************************************************************************** diff --git a/sound/oss/cs46xx.c b/sound/oss/cs46xx.c index 41d61bc6e95b0..ee682b97127d6 100644 --- a/sound/oss/cs46xx.c +++ b/sound/oss/cs46xx.c @@ -1670,7 +1670,7 @@ static void cs_handle_midi(struct cs_card *card) wake_up(&card->midi.owait); } -static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct cs_card *card = (struct cs_card *)dev_id; /* Single channel card */ @@ -1688,7 +1688,7 @@ static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV); spin_unlock(&card->lock); - return; + return IRQ_HANDLED; /* Might be IRQ_NONE.. */ } /* @@ -1709,6 +1709,7 @@ static void cs_interrupt(int irq, void *dev_id, struct pt_regs *regs) cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV); spin_unlock(&card->lock); CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n")); + return IRQ_HANDLED; } diff --git a/sound/oss/dmasound/dmasound_atari.c b/sound/oss/dmasound/dmasound_atari.c index ff35be069d2eb..4d0994a4451e8 100644 --- a/sound/oss/dmasound/dmasound_atari.c +++ b/sound/oss/dmasound/dmasound_atari.c @@ -134,7 +134,7 @@ static int FalconSetFormat(int format); static int FalconSetVolume(int volume); static void AtaPlayNextFrame(int index); static void AtaPlay(void); -static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t AtaInterrupt(int irq, void *dummy, struct pt_regs *fp); /*** Mid level stuff *********************************************************/ @@ -1250,7 +1250,7 @@ static void AtaPlay(void) } -static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) { #if 0 /* ++TeSche: if you should want to test this... */ @@ -1259,7 +1259,7 @@ static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) if (++cnt == 10) { /* simulate losing an interrupt */ cnt = 0; - return; + return IRQ_HANDLED; } #endif spin_lock(&dmasound.lock); @@ -1269,7 +1269,7 @@ static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) * (almost) like on the TT. */ write_sq_ignore_int = 0; - return; + return IRQ_HANDLED; } if (!write_sq.active) { @@ -1277,7 +1277,7 @@ static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) * the sq variables, so better don't do anything here. */ WAKE_UP(write_sq.sync_queue); - return; + return IRQ_HANDLED; } /* Probably ;) one frame is finished. Well, in fact it may be that a @@ -1315,6 +1315,7 @@ static void AtaInterrupt(int irq, void *dummy, struct pt_regs *fp) is nothing to play any more. Wake up a process waiting for audio output to drain. */ spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } diff --git a/sound/oss/dmasound/dmasound_awacs.c b/sound/oss/dmasound/dmasound_awacs.c index b7139ecff576f..45b57afd9c615 100644 --- a/sound/oss/dmasound/dmasound_awacs.c +++ b/sound/oss/dmasound/dmasound_awacs.c @@ -266,9 +266,9 @@ static int PMacSetFormat(int format); static int PMacSetVolume(int volume); static void PMacPlay(void); static void PMacRecord(void); -static void pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs); -static void pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs); -static void pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs); +static irqreturn_t pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs); +static irqreturn_t pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs); +static irqreturn_t pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs); static void awacs_write(int val); static int awacs_get_volume(int reg, int lshift); static int awacs_volume_setter(int volume, int n, int mute, int lshift); @@ -395,20 +395,24 @@ read_audio_gpio(int gpio_addr) return ((pmac_call_feature(PMAC_FTR_READ_GPIO, NULL, gpio_addr, 0) & 0x02) !=0); } -static void +static irqreturn_t headphone_intr(int irq, void *devid, struct pt_regs *regs) { + int handled = 0; spin_lock(&dmasound.lock); if (read_audio_gpio(gpio_headphone_detect) == gpio_headphone_detect_pol) { + handled = 1; printk(KERN_INFO "Audio jack plugged, muting speakers.\n"); write_audio_gpio(gpio_amp_mute, gpio_amp_mute_pol); write_audio_gpio(gpio_headphone_mute, !gpio_headphone_mute_pol); } else { + handled = 1; printk(KERN_INFO "Audio jack unplugged, enabling speakers.\n"); write_audio_gpio(gpio_amp_mute, !gpio_amp_mute_pol); write_audio_gpio(gpio_headphone_mute, gpio_headphone_mute_pol); } spin_unlock(&dmasound.lock); + return IRQ_RETVAL(handled); } @@ -923,7 +927,7 @@ static void PMacRecord(void) 'next_cmd' field will already point back to the original loop of blocks. */ -static void +static irqreturn_t pmac_awacs_tx_intr(int irq, void *devid, struct pt_regs *regs) { int i = write_sq.front; @@ -1009,10 +1013,11 @@ printk("dmasound_pmac: tx-irq: xfer died - patching it up...\n") ; if (!write_sq.active && (write_sq.syncing & 1)) WAKE_UP(write_sq.sync_queue); /* any time we're empty */ spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } -static void +static irqreturn_t pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs) { int stat ; @@ -1023,12 +1028,12 @@ pmac_awacs_rx_intr(int irq, void *devid, struct pt_regs *regs) * just blow it off. */ if (in_le32(&awacs_rxdma->cmdptr) == 0) - return; + return IRQ_HANDLED; /* We also want to blow 'em off when shutting down. */ if (read_sq.active == 0) - return; + return IRQ_HANDLED; spin_lock(&dmasound.lock); /* Check multiple buffers in case we were held off from @@ -1063,7 +1068,7 @@ printk("dmasound_pmac: rx-irq: DIED - attempting resurection\n"); out_le32(&awacs_rxdma->control, ((RUN|WAKE) << 16) + (RUN|WAKE)); spin_unlock(&dmasound.lock); - return; /* try this block again */ + return IRQ_HANDLED; /* try this block again */ } /* Clear status and move on to next buffer. */ @@ -1091,10 +1096,11 @@ printk("dmasound_pmac: rx-irq: DIED - attempting resurection\n"); WAKE_UP(read_sq.action_queue); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } -static void +static irqreturn_t pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs) { int ctrl; @@ -1113,6 +1119,7 @@ pmac_awacs_intr(int irq, void *devid, struct pt_regs *regs) /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */ out_le32(&awacs->control, ctrl); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } static void diff --git a/sound/oss/dmasound/dmasound_paula.c b/sound/oss/dmasound/dmasound_paula.c index 1acc158359dfc..18ebbcee853c2 100644 --- a/sound/oss/dmasound/dmasound_paula.c +++ b/sound/oss/dmasound/dmasound_paula.c @@ -83,7 +83,7 @@ static int AmiSetVolume(int volume); static int AmiSetTreble(int treble); static void AmiPlayNextFrame(int index); static void AmiPlay(void); -static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t AmiInterrupt(int irq, void *dummy, struct pt_regs *fp); #ifdef CONFIG_HEARTBEAT @@ -567,7 +567,7 @@ static void AmiPlay(void) } -static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t AmiInterrupt(int irq, void *dummy, struct pt_regs *fp) { int minframes = 1; @@ -578,7 +578,7 @@ static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp) * the sq variables, so better don't do anything here. */ WAKE_UP(write_sq.sync_queue); - return; + return IRQ_HANDLED; } if (write_sq.active & AMI_PLAY_PLAYING) { @@ -608,6 +608,7 @@ static void AmiInterrupt(int irq, void *dummy, struct pt_regs *fp) /* Nothing to play anymore. Wake up a process waiting for audio output to drain. */ WAKE_UP(write_sq.sync_queue); + return IRQ_HANDLED; } /*** Mid level stuff *********************************************************/ diff --git a/sound/oss/dmasound/dmasound_q40.c b/sound/oss/dmasound/dmasound_q40.c index a6fa07a04a08e..1bb949878f2d7 100644 --- a/sound/oss/dmasound/dmasound_q40.c +++ b/sound/oss/dmasound/dmasound_q40.c @@ -49,8 +49,8 @@ static int Q40SetFormat(int format); static int Q40SetVolume(int volume); static void Q40PlayNextFrame(int index); static void Q40Play(void); -static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp); -static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp); +static irqreturn_t Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp); static void Q40Interrupt(void); @@ -464,7 +464,7 @@ static void Q40Play(void) spin_unlock_irqrestore_flags(&dmasound.lock, flags); } -static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp) { spin_lock(&dmasound.lock); if (q40_sc>1){ @@ -474,8 +474,9 @@ static void Q40StereoInterrupt(int irq, void *dummy, struct pt_regs *fp) master_outb(1,SAMPLE_CLEAR_REG); }else Q40Interrupt(); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } -static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp) { spin_lock(&dmasound.lock); if (q40_sc>0){ @@ -485,6 +486,7 @@ static void Q40MonoInterrupt(int irq, void *dummy, struct pt_regs *fp) master_outb(1,SAMPLE_CLEAR_REG); }else Q40Interrupt(); spin_unlock(&dmasound.lock); + return IRQ_HANDLED; } static void Q40Interrupt(void) { diff --git a/sound/oss/emu10k1/cardwo.c b/sound/oss/emu10k1/cardwo.c index e6d8f42ae3464..57e151a97e628 100644 --- a/sound/oss/emu10k1/cardwo.c +++ b/sound/oss/emu10k1/cardwo.c @@ -444,7 +444,7 @@ static void copy_ilv_block(struct woinst *woinst, u32 str, u8 *src, u32 len) while (len) { for (voice_num = 0; voice_num < woinst->num_voices; voice_num++) { if (__copy_from_user((u8 *)(voice[voice_num].mem.addr[pg]) + pgoff, src, woinst->format.bytespervoicesample)) - return -EFAULT; + return; src += woinst->format.bytespervoicesample; } diff --git a/sound/oss/emu10k1/irqmgr.c b/sound/oss/emu10k1/irqmgr.c index 876216a796992..d19b464ba01b5 100644 --- a/sound/oss/emu10k1/irqmgr.c +++ b/sound/oss/emu10k1/irqmgr.c @@ -37,10 +37,11 @@ /* Interrupt handler */ -void emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct emu10k1_card *card = (struct emu10k1_card *) dev_id; u32 irqstatus, irqstatus_tmp; + int handled = 0; DPD(4, "emu10k1_interrupt called, irq = %u\n", irq); @@ -105,6 +106,8 @@ void emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) } /* acknowledge interrupt */ - outl(irqstatus_tmp, card->iobase + IPR); + outl(irqstatus_tmp, card->iobase + IPR); + handled = 1; } + return IRQ_RETVAL(handled); } diff --git a/sound/oss/emu10k1/main.c b/sound/oss/emu10k1/main.c index 57130d74c30f0..80c3e69846c22 100644 --- a/sound/oss/emu10k1/main.c +++ b/sound/oss/emu10k1/main.c @@ -157,7 +157,7 @@ extern struct file_operations emu10k1_midi_fops; static struct midi_operations emu10k1_midi_operations; #endif -extern void emu10k1_interrupt(int, void *, struct pt_regs *s); +extern irqreturn_t emu10k1_interrupt(int, void *, struct pt_regs *s); static int __devinit emu10k1_audio_init(struct emu10k1_card *card) { diff --git a/sound/oss/es1370.c b/sound/oss/es1370.c index eaa7c9ccb3195..ed412fd65b872 100644 --- a/sound/oss/es1370.c +++ b/sound/oss/es1370.c @@ -755,7 +755,7 @@ static void es1370_handle_midi(struct es1370_state *s) outb((s->midi.ocnt > 0) ? UCTRL_RXINTEN | UCTRL_ENA_TXINT : UCTRL_RXINTEN, s->io+ES1370_REG_UART_CONTROL); } -static void es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct es1370_state *s = (struct es1370_state *)dev_id; unsigned int intsrc, sctl; @@ -763,7 +763,7 @@ static void es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* fastpath out, to ease interrupt sharing */ intsrc = inl(s->io+ES1370_REG_STATUS); if (!(intsrc & 0x80000000)) - return; + return IRQ_NONE; spin_lock(&s->lock); /* clear audio interrupts first */ sctl = s->sctrl; @@ -778,6 +778,7 @@ static void es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs) es1370_update_ptr(s); es1370_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff --git a/sound/oss/es1371.c b/sound/oss/es1371.c index 3d7f57ffce5e3..443677a7a9313 100644 --- a/sound/oss/es1371.c +++ b/sound/oss/es1371.c @@ -1091,7 +1091,7 @@ static void es1371_handle_midi(struct es1371_state *s) outb((s->midi.ocnt > 0) ? UCTRL_RXINTEN | UCTRL_ENA_TXINT : UCTRL_RXINTEN, s->io+ES1371_REG_UART_CONTROL); } -static void es1371_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t es1371_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct es1371_state *s = (struct es1371_state *)dev_id; unsigned int intsrc, sctl; @@ -1099,7 +1099,7 @@ static void es1371_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* fastpath out, to ease interrupt sharing */ intsrc = inl(s->io+ES1371_REG_STATUS); if (!(intsrc & 0x80000000)) - return; + return IRQ_NONE; spin_lock(&s->lock); /* clear audio interrupts first */ sctl = s->sctrl; @@ -1114,6 +1114,7 @@ static void es1371_interrupt(int irq, void *dev_id, struct pt_regs *regs) es1371_update_ptr(s); es1371_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff --git a/sound/oss/esssolo1.c b/sound/oss/esssolo1.c index 3fd801a8dac5c..ed6ecdf6cc40c 100644 --- a/sound/oss/esssolo1.c +++ b/sound/oss/esssolo1.c @@ -1694,7 +1694,7 @@ static void solo1_handle_midi(struct solo1_state *s) wake_up(&s->midi.owait); } -static void solo1_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t solo1_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct solo1_state *s = (struct solo1_state *)dev_id; unsigned int intsrc; @@ -1702,7 +1702,7 @@ static void solo1_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* fastpath out, to ease interrupt sharing */ intsrc = inb(s->iobase+7); /* get interrupt source(s) */ if (!intsrc) - return; + return IRQ_NONE; (void)inb(s->sbbase+0xe); /* clear interrupt */ spin_lock(&s->lock); /* clear audio interrupts first */ @@ -1711,6 +1711,7 @@ static void solo1_interrupt(int irq, void *dev_id, struct pt_regs *regs) solo1_update_ptr(s); solo1_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } static void solo1_midi_timer(unsigned long data) diff --git a/sound/oss/gus.h b/sound/oss/gus.h index 53b70bce01180..45b60fac1014b 100644 --- a/sound/oss/gus.h +++ b/sound/oss/gus.h @@ -3,7 +3,7 @@ /* From gus_card.c */ int gus_set_midi_irq(int num); -void gusintr(int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t gusintr(int irq, void *dev_id, struct pt_regs * dummy); /* From gus_wave.c */ int gus_wave_detect(int baseaddr); diff --git a/sound/oss/gus_card.c b/sound/oss/gus_card.c index 4d308f21bae98..d7a56331ecaed 100644 --- a/sound/oss/gus_card.c +++ b/sound/oss/gus_card.c @@ -25,7 +25,7 @@ #include "gus.h" #include "gus_hw.h" -void gusintr(int irq, void *dev_id, struct pt_regs *dummy); +irqreturn_t gusintr(int irq, void *dev_id, struct pt_regs *dummy); int gus_base = 0, gus_irq = 0, gus_dma = 0; int gus_no_wave_dma = 0; @@ -119,10 +119,11 @@ static void __exit unload_gus(struct address_info *hw_config) sound_free_dma(hw_config->dma2); } -void gusintr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t gusintr(int irq, void *dev_id, struct pt_regs *dummy) { unsigned char src; extern int gus_timer_enabled; + int handled = 0; #ifdef CONFIG_SOUND_GUSMAX if (have_gus_max) { @@ -140,8 +141,8 @@ void gusintr(int irq, void *dev_id, struct pt_regs *dummy) while (1) { if (!(src = inb(u_IrqStatus))) - return; - + break; + handled = 1; if (src & DMA_TC_IRQ) { guswave_dma_irq(); @@ -160,6 +161,7 @@ void gusintr(int irq, void *dev_id, struct pt_regs *dummy) if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ)) gus_voice_irq(); } + return IRQ_RETVAL(handled); } /* diff --git a/sound/oss/gus_wave.c b/sound/oss/gus_wave.c index 2428b2fcaf768..722e481379674 100644 --- a/sound/oss/gus_wave.c +++ b/sound/oss/gus_wave.c @@ -508,7 +508,7 @@ static void step_envelope(int voice) { unsigned vol, prev_vol, phase; unsigned char rate; - long int flags; + unsigned long flags; if (voices[voice].mode & WAVE_SUSTAIN_ON && voices[voice].env_phase == 2) { @@ -593,7 +593,7 @@ static void start_release(int voice) static void gus_voice_fade(int voice) { int instr_no = sample_map[voice], is16bits; - long int flags; + unsigned long flags; spin_lock_irqsave(&gus_lock,flags); gus_select_voice(voice); @@ -1511,7 +1511,7 @@ static int guswave_start_note2(int dev, int voice, int note_num, int volume) static int guswave_start_note(int dev, int voice, int note_num, int volume) { - long int flags; + unsigned long flags; int mode; int ret_val = 0; diff --git a/sound/oss/i810_audio.c b/sound/oss/i810_audio.c index 3e1fc2572167d..3f10d2cfbab57 100644 --- a/sound/oss/i810_audio.c +++ b/sound/oss/i810_audio.c @@ -1389,7 +1389,7 @@ static void i810_channel_interrupt(struct i810_card *card) #endif } -static void i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct i810_card *card = (struct i810_card *)dev_id; u32 status; @@ -1401,7 +1401,7 @@ static void i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) if(!(status & INT_MASK)) { spin_unlock(&card->lock); - return; /* not for us */ + return IRQ_NONE; /* not for us */ } if(status & (INT_PO|INT_PI|INT_MC)) @@ -1410,6 +1410,7 @@ static void i810_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* clear 'em */ outl(status & INT_MASK, card->iobase + GLOB_STA); spin_unlock(&card->lock); + return IRQ_HANDLED; } /* in this loop, dmabuf.count signifies the amount of data that is diff --git a/sound/oss/ite8172.c b/sound/oss/ite8172.c index 8a1189ee1a055..c88a3174f5f65 100644 --- a/sound/oss/ite8172.c +++ b/sound/oss/ite8172.c @@ -727,7 +727,7 @@ static inline int prog_dmabuf_dac(struct it8172_state *s) /* hold spinlock for the following! */ -static void it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct it8172_state *s = (struct it8172_state *)dev_id; struct dmabuf* dac = &s->dma_dac; @@ -741,8 +741,10 @@ static void it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs) isc = inb(s->io+IT_AC_ISC); /* fastpath out, to ease interrupt sharing */ - if (!(isc & (ISC_VCI | ISC_CCI | ISC_PCI))) - return; + if (!(isc & (ISC_VCI | ISC_CCI | ISC_PCI))) { + spin_unlock(&s->lock); + return IRQ_NONE; + } /* clear audio interrupts first */ outb(isc | ISC_VCI | ISC_CCI | ISC_PCI, s->io+IT_AC_ISC); @@ -819,6 +821,7 @@ static void it8172_interrupt(int irq, void *dev_id, struct pt_regs *regs) } spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff --git a/sound/oss/maestro.c b/sound/oss/maestro.c index f21ea333471b8..9938514b06ffd 100644 --- a/sound/oss/maestro.c +++ b/sound/oss/maestro.c @@ -1631,7 +1631,7 @@ static inline unsigned get_dmac(struct ess_state *s) * Meet Bob, the timer... */ -static void ess_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t ess_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void stop_bob(struct ess_state *s) { @@ -1900,7 +1900,7 @@ ess_update_ptr(struct ess_state *s) } } -static void +static irqreturn_t ess_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct ess_state *s; @@ -1908,7 +1908,8 @@ ess_interrupt(int irq, void *dev_id, struct pt_regs *regs) int i; u32 event; - if ( ! (event = inb(c->iobase+0x1A)) ) return; + if ( ! (event = inb(c->iobase+0x1A)) ) + return IRQ_NONE; outw(inw(c->iobase+4)&1, c->iobase+4); @@ -1972,6 +1973,7 @@ ess_interrupt(int irq, void *dev_id, struct pt_regs *regs) ess_update_ptr(s); spin_unlock(&s->lock); } + return IRQ_HANDLED; } diff --git a/sound/oss/maestro3.c b/sound/oss/maestro3.c index a6d8fea036f7b..29a31d0daa048 100644 --- a/sound/oss/maestro3.c +++ b/sound/oss/maestro3.c @@ -1232,7 +1232,7 @@ static void m3_update_ptr(struct m3_state *s) } } -static void m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct m3_card *c = (struct m3_card *)dev_id; struct m3_state *s = &c->channels[0]; @@ -1240,13 +1240,14 @@ static void m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) status = inb(c->iobase+0x1A); - if(status == 0xff) return; + if(status == 0xff) + return IRQ_NONE; /* presumably acking the ints? */ outw(status, c->iobase+0x1A); if(c->in_suspend) - return; + return IRQ_HANDLED; /* * ack an assp int if its running @@ -1269,6 +1270,7 @@ static void m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* XXX is this needed? */ if(status & 0x40) outb(0x40, c->iobase+0x1A); + return IRQ_HANDLED; } diff --git a/sound/oss/maui.c b/sound/oss/maui.c index 789cf6fa04bad..9edcdc86fe66a 100644 --- a/sound/oss/maui.c +++ b/sound/oss/maui.c @@ -102,9 +102,10 @@ static int maui_write(unsigned char data) return 0; } -static void mauiintr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t mauiintr(int irq, void *dev_id, struct pt_regs *dummy) { irq_ok = 1; + return IRQ_HANDLED; } static int __init download_code(void) diff --git a/sound/oss/mpu401.c b/sound/oss/mpu401.c index b37bd204caa2e..c9b7043dae0ba 100644 --- a/sound/oss/mpu401.c +++ b/sound/oss/mpu401.c @@ -444,15 +444,17 @@ int intchk_mpu401(void *dev_id) return input_avail(devc); } -void mpuintr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t mpuintr(int irq, void *dev_id, struct pt_regs *dummy) { struct mpu_config *devc; int dev = (int) dev_id; + int handled = 0; devc = &dev_conf[dev]; if (input_avail(devc)) { + handled = 1; if (devc->base != 0 && (devc->opened & OPEN_READ || devc->mode == MODE_SYNTH)) mpu401_input_loop(devc); else @@ -461,6 +463,7 @@ void mpuintr(int irq, void *dev_id, struct pt_regs *dummy) read_data(devc); } } + return IRQ_RETVAL(handled); } static int mpu401_open(int dev, int mode, @@ -500,7 +503,7 @@ static int mpu401_open(int dev, int mode, { if (!try_module_get(coprocessor->owner)) { mpu401_close(dev); - return err; + return -ENODEV; } if ((err = coprocessor->open(coprocessor->devc, COPR_MIDI)) < 0) @@ -839,7 +842,7 @@ static int mpu_synth_open(int dev, int mode) coprocessor = midi_devs[midi_dev]->coproc; if (coprocessor) { if (!try_module_get(coprocessor->owner)) - return err; + return -ENODEV; if ((err = coprocessor->open(coprocessor->devc, COPR_MIDI)) < 0) { diff --git a/sound/oss/mpu401.h b/sound/oss/mpu401.h index 89683909b0d43..43ff5430cd450 100644 --- a/sound/oss/mpu401.h +++ b/sound/oss/mpu401.h @@ -3,7 +3,7 @@ int probe_uart401 (struct address_info *hw_config, struct module *owner); void unload_uart401 (struct address_info *hw_config); -void uart401intr (int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t uart401intr (int irq, void *dev_id, struct pt_regs * dummy); /* From mpu401.c */ int probe_mpu401(struct address_info *hw_config); @@ -11,4 +11,4 @@ int attach_mpu401(struct address_info * hw_config, struct module *owner); void unload_mpu401(struct address_info *hw_info); int intchk_mpu401(void *dev_id); -void mpuintr(int irq, void *dev_id, struct pt_regs * dummy); +irqreturn_t mpuintr(int irq, void *dev_id, struct pt_regs * dummy); diff --git a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c index 4cca7db8f4ee7..760a617ec17ab 100644 --- a/sound/oss/msnd_pinnacle.c +++ b/sound/oss/msnd_pinnacle.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -1061,7 +1062,7 @@ static __inline__ void eval_dsp_msg(register WORD wMessage) } } -static void intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t intr(int irq, void *dev_id, struct pt_regs *regs) { /* Send ack to DSP */ inb(dev.io + HP_RXL); @@ -1077,6 +1078,7 @@ static void intr(int irq, void *dev_id, struct pt_regs *regs) else isa_writew(wTmp, dev.DSPQ + JQS_wHead); } + return IRQ_HANDLED; } static struct file_operations dev_fileops = { diff --git a/sound/oss/nec_vrc5477.c b/sound/oss/nec_vrc5477.c index 7ebf678116314..d11cde9b8860d 100644 --- a/sound/oss/nec_vrc5477.c +++ b/sound/oss/nec_vrc5477.c @@ -813,7 +813,7 @@ static inline void vrc5477_ac97_dac_interrupt(struct vrc5477_ac97_state *s) wake_up_interruptible(&dac->wait); } -static void vrc5477_ac97_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t vrc5477_ac97_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct vrc5477_ac97_state *s = (struct vrc5477_ac97_state *)dev_id; u32 irqStatus; @@ -851,6 +851,7 @@ static void vrc5477_ac97_interrupt(int irq, void *dev_id, struct pt_regs *regs) } spin_unlock(&s->lock); + return IRQ_HANDLED; } /* --------------------------------------------------------------------- */ diff --git a/sound/oss/nm256.h b/sound/oss/nm256.h index a8af512bcb3ce..583004ef0aa17 100644 --- a/sound/oss/nm256.h +++ b/sound/oss/nm256.h @@ -2,6 +2,8 @@ #define _NM256_H_ #include +#include + #include "ac97.h" /* The revisions that we currently handle. */ @@ -113,7 +115,7 @@ struct nm256_info int has_irq; /* The card interrupt service routine. */ - void (*introutine) (int, void *, struct pt_regs *); + irqreturn_t (*introutine) (int, void *, struct pt_regs *); /* Current audio config, cached. */ struct sinfo { diff --git a/sound/oss/nm256_audio.c b/sound/oss/nm256_audio.c index 4fe4fda275fcc..1d8ec153ed10f 100644 --- a/sound/oss/nm256_audio.c +++ b/sound/oss/nm256_audio.c @@ -44,8 +44,8 @@ static struct audio_driver nm256_audio_driver; static int nm256_grabInterrupt (struct nm256_info *card); static int nm256_releaseInterrupt (struct nm256_info *card); -static void nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy); -static void nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy); +static irqreturn_t nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy); +static irqreturn_t nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy); static int handle_pm_event (struct pm_dev *dev, pm_request_t rqst, void *data); /* These belong in linux/pci.h. */ @@ -528,16 +528,17 @@ nm256_initHw (struct nm256_info *card) * I suppose...yucky bleah.) */ -static void +static irqreturn_t nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) { struct nm256_info *card = (struct nm256_info *)dev_id; u16 status; static int badintrcount = 0; + int handled = 0; if ((card == NULL) || (card->magsig != NM_MAGIC_SIG)) { printk (KERN_ERR "NM256: Bad card pointer\n"); - return; + return IRQ_NONE; } status = nm256_readPort16 (card, 2, NM_INT_REG); @@ -558,13 +559,14 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) * inserted a PCMCIA card and someone's spamming us with IRQ 9s. */ + handled = 1; if (card->playing) stopPlay (card); if (card->recording) stopRecord (card); badintrcount = 0; } - return; + return IRQ_RETVAL(handled); } badintrcount = 0; @@ -572,6 +574,7 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) /* Rather boring; check for individual interrupts and process them. */ if (status & NM_PLAYBACK_INT) { + handled = 1; status &= ~NM_PLAYBACK_INT; NM_ACK_INT (card, NM_PLAYBACK_INT); @@ -580,6 +583,7 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) } if (status & NM_RECORD_INT) { + handled = 1; status &= ~NM_RECORD_INT; NM_ACK_INT (card, NM_RECORD_INT); @@ -590,6 +594,7 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) if (status & NM_MISC_INT_1) { u8 cbyte; + handled = 1; status &= ~NM_MISC_INT_1; printk (KERN_ERR "NM256: Got misc interrupt #1\n"); NM_ACK_INT (card, NM_MISC_INT_1); @@ -601,6 +606,7 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) if (status & NM_MISC_INT_2) { u8 cbyte; + handled = 1; status &= ~NM_MISC_INT_2; printk (KERN_ERR "NM256: Got misc interrupt #2\n"); NM_ACK_INT (card, NM_MISC_INT_2); @@ -610,11 +616,13 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) /* Unknown interrupt. */ if (status) { + handled = 1; printk (KERN_ERR "NM256: Fire in the hole! Unknown status 0x%x\n", status); /* Pray. */ NM_ACK_INT (card, status); } + return IRQ_RETVAL(handled); } /* @@ -623,16 +631,17 @@ nm256_interrupt (int irq, void *dev_id, struct pt_regs *dummy) * routine. */ -static void +static irqreturn_t nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) { struct nm256_info *card = (struct nm256_info *)dev_id; u32 status; static int badintrcount = 0; + int handled = 0; if ((card == NULL) || (card->magsig != NM_MAGIC_SIG)) { printk (KERN_ERR "NM256: Bad card pointer\n"); - return; + return IRQ_NONE; } status = nm256_readPort32 (card, 2, NM_INT_REG); @@ -655,13 +664,14 @@ nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) * IRQ 9s. */ + handled = 1; if (card->playing) stopPlay (card); if (card->recording) stopRecord (card); badintrcount = 0; } - return; + return IRQ_RETVAL(handled); } badintrcount = 0; @@ -669,6 +679,7 @@ nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) /* Rather boring; check for individual interrupts and process them. */ if (status & NM2_PLAYBACK_INT) { + handled = 1; status &= ~NM2_PLAYBACK_INT; NM2_ACK_INT (card, NM2_PLAYBACK_INT); @@ -677,6 +688,7 @@ nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) } if (status & NM2_RECORD_INT) { + handled = 1; status &= ~NM2_RECORD_INT; NM2_ACK_INT (card, NM2_RECORD_INT); @@ -687,6 +699,7 @@ nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) if (status & NM2_MISC_INT_1) { u8 cbyte; + handled = 1; status &= ~NM2_MISC_INT_1; printk (KERN_ERR "NM256: Got misc interrupt #1\n"); NM2_ACK_INT (card, NM2_MISC_INT_1); @@ -697,6 +710,7 @@ nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) if (status & NM2_MISC_INT_2) { u8 cbyte; + handled = 1; status &= ~NM2_MISC_INT_2; printk (KERN_ERR "NM256: Got misc interrupt #2\n"); NM2_ACK_INT (card, NM2_MISC_INT_2); @@ -706,11 +720,13 @@ nm256_interrupt_zx (int irq, void *dev_id, struct pt_regs *dummy) /* Unknown interrupt. */ if (status) { + handled = 1; printk (KERN_ERR "NM256: Fire in the hole! Unknown status 0x%x\n", status); /* Pray. */ NM2_ACK_INT (card, status); } + return IRQ_RETVAL(handled); } /* diff --git a/sound/oss/pas2_card.c b/sound/oss/pas2_card.c index 27bb3ae9088ab..96334e418bf14 100644 --- a/sound/oss/pas2_card.c +++ b/sound/oss/pas2_card.c @@ -89,7 +89,7 @@ void pas_write(unsigned char data, int ioaddr) /******************* Begin of the Interrupt Handler ********************/ -void pasintr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t pasintr(int irq, void *dev_id, struct pt_regs *dummy) { int status; @@ -106,6 +106,7 @@ void pasintr(int irq, void *dev_id, struct pt_regs *dummy) pas_midi_interrupt(); status &= ~0x10; } + return IRQ_HANDLED; } int pas_set_intr(int mask) diff --git a/sound/oss/pss.c b/sound/oss/pss.c index 1be0232413e3d..f88c3d4a0043f 100644 --- a/sound/oss/pss.c +++ b/sound/oss/pss.c @@ -152,7 +152,7 @@ static int pss_enable_joystick = 0;/* Parameter for enabling the joystick */ static void pss_write(pss_confdata *devc, int data) { - int i, limit; + unsigned long i, limit; limit = jiffies + HZ/10; /* The timeout is 0.1 seconds */ /* @@ -305,7 +305,8 @@ static int pss_get_dspword(pss_confdata * devc, unsigned short *word) static int pss_download_boot(pss_confdata * devc, unsigned char *block, int size, int flags) { - int i, limit, val, count; + int i, val, count; + unsigned long limit; if (flags & CPF_FIRST) { diff --git a/sound/oss/rme96xx.c b/sound/oss/rme96xx.c index e8d99ad90efe6..f8cd52e234c2a 100644 --- a/sound/oss/rme96xx.c +++ b/sound/oss/rme96xx.c @@ -542,7 +542,7 @@ static inline int rme96xx_spdif_sample_rate (rme96xx_info *s, int *spdifrate) inline int rme96xx_gethwptr(rme96xx_info* s,int exact) { - long flags; + unsigned long flags; if (exact) { unsigned int hwp; /* the hwptr seems to be rather unreliable :(, so we don't use it */ @@ -587,7 +587,7 @@ static void rme96xx_clearbufs(struct dmabuf* dma) static int rme96xx_startcard(rme96xx_info *s,int stop) { int i; - long flags; + unsigned long flags; COMM ("startcard"); if(s->control_register & RME96xx_IE){ @@ -760,7 +760,7 @@ inline int rme96xx_copytouser(struct dmabuf* dma,const char* buffer,int count,in } -static void rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { int i; rme96xx_info *s = (rme96xx_info *)dev_id; @@ -770,7 +770,7 @@ static void rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) status = readl(s->iobase + RME96xx_status_register); if (!(status & RME96xx_IRQ)) { - return; + return IRQ_NONE; } spin_lock_irqsave(&s->lock,flags); @@ -785,6 +785,7 @@ static void rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) wake_up(&(db->wait)); } spin_unlock_irqrestore(&s->lock,flags); + return IRQ_HANDLED; } diff --git a/sound/oss/sb_common.c b/sound/oss/sb_common.c index fe8f782fa4e97..3639a53c748f4 100644 --- a/sound/oss/sb_common.c +++ b/sound/oss/sb_common.c @@ -201,7 +201,7 @@ static void pci_intr(sb_devc *devc) sb_intr(devc); } -static void sbintr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t sbintr(int irq, void *dev_id, struct pt_regs *dummy) { sb_devc *devc = dev_id; @@ -219,6 +219,7 @@ static void sbintr(int irq, void *dev_id, struct pt_regs *dummy) sb_intr (devc); break; } + return IRQ_HANDLED; } int sb_dsp_reset(sb_devc * devc) diff --git a/sound/oss/sonicvibes.c b/sound/oss/sonicvibes.c index 065398b842ca6..0ba7aee5028c7 100644 --- a/sound/oss/sonicvibes.c +++ b/sound/oss/sonicvibes.c @@ -899,7 +899,7 @@ static void sv_handle_midi(struct sv_state *s) wake_up(&s->midi.owait); } -static void sv_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t sv_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct sv_state *s = (struct sv_state *)dev_id; unsigned int intsrc; @@ -907,11 +907,12 @@ static void sv_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* fastpath out, to ease interrupt sharing */ intsrc = inb(s->ioenh + SV_CODEC_STATUS); if (!(intsrc & (SV_CSTAT_DMAA | SV_CSTAT_DMAC | SV_CSTAT_MIDI))) - return; + return IRQ_NONE; spin_lock(&s->lock); sv_update_ptr(s); sv_handle_midi(s); spin_unlock(&s->lock); + return IRQ_HANDLED; } static void sv_midi_timer(unsigned long data) diff --git a/sound/oss/trident.c b/sound/oss/trident.c index fa31e3352ee84..d608cab2e3bc6 100644 --- a/sound/oss/trident.c +++ b/sound/oss/trident.c @@ -1728,7 +1728,7 @@ static void cyber_address_interrupt(struct trident_card *card) } } -static void trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct trident_card *card = (struct trident_card *)dev_id; u32 event; @@ -1755,13 +1755,14 @@ static void trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) event = inl(TRID_REG(card, T4D_MISCINT)); outl(event | (ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(card, T4D_MISCINT)); spin_unlock(&card->lock); - return; + return IRQ_HANDLED; } /* manually clear interrupt status, bad hardware design, blame T^2 */ outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(card, T4D_MISCINT)); spin_unlock(&card->lock); + return IRQ_HANDLED; } /* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to diff --git a/sound/oss/uart401.c b/sound/oss/uart401.c index 8b354ec0e7418..aaed8616834ff 100644 --- a/sound/oss/uart401.c +++ b/sound/oss/uart401.c @@ -96,18 +96,19 @@ static void uart401_input_loop(uart401_devc * devc) printk(KERN_WARNING "Too much work in interrupt on uart401 (0x%X). UART jabbering ??\n", devc->base); } -void uart401intr(int irq, void *dev_id, struct pt_regs *dummy) +irqreturn_t uart401intr(int irq, void *dev_id, struct pt_regs *dummy) { uart401_devc *devc = dev_id; if (devc == NULL) { printk(KERN_ERR "uart401: bad devc\n"); - return; + return IRQ_NONE; } if (input_avail(devc)) uart401_input_loop(devc); + return IRQ_HANDLED; } static int diff --git a/sound/oss/uart6850.c b/sound/oss/uart6850.c index f7fb117eb6144..3c004ab762c47 100644 --- a/sound/oss/uart6850.c +++ b/sound/oss/uart6850.c @@ -105,10 +105,11 @@ static void uart6850_input_loop(void) } } -void m6850intr(int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t m6850intr(int irq, void *dev_id, struct pt_regs *dummy) { if (input_avail()) uart6850_input_loop(); + return IRQ_HANDLED; } /* diff --git a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c index 24199a78cf250..aea7c23e46c96 100644 --- a/sound/oss/via82cxxx_audio.c +++ b/sound/oss/via82cxxx_audio.c @@ -1694,10 +1694,11 @@ static void via_intr_channel (struct via_channel *chan) } -static void via_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t via_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct via_info *card = dev_id; u32 status32; + int handled = 0; /* to minimize interrupt sharing costs, we use the SGD status * shadow register to check the status of all inputs and @@ -1708,10 +1709,12 @@ static void via_interrupt(int irq, void *dev_id, struct pt_regs *regs) if (!(status32 & VIA_INTR_MASK)) { #ifdef CONFIG_MIDI_VIA82CXXX - if (card->midi_devc) + if (card->midi_devc) { uart401intr(irq, card->midi_devc, regs); + handled = 1; + } #endif - return; + goto out; } DPRINTK ("intr, status32 == 0x%08X\n", status32); @@ -1720,14 +1723,21 @@ static void via_interrupt(int irq, void *dev_id, struct pt_regs *regs) */ spin_lock (&card->lock); - if (status32 & VIA_INTR_OUT) + if (status32 & VIA_INTR_OUT) { + handled = 1; via_intr_channel (&card->ch_out); - if (status32 & VIA_INTR_IN) + } + if (status32 & VIA_INTR_IN) { + handled = 1; via_intr_channel (&card->ch_in); - if (status32 & VIA_INTR_FM) + } + if (status32 & VIA_INTR_FM) { + handled = 1; via_intr_channel (&card->ch_fm); - + } spin_unlock (&card->lock); +out: + return IRQ_RETVAL(handled); } diff --git a/sound/oss/vidc.h b/sound/oss/vidc.h index b3e70ad1c4cdd..4fbcebf1458ee 100644 --- a/sound/oss/vidc.h +++ b/sound/oss/vidc.h @@ -37,7 +37,7 @@ extern unsigned long vidc_fill_2x16_s(unsigned long ibuf, unsigned long iend, * DMA Interrupt handler */ -extern void vidc_sound_dma_irq(int irqnr, void *ref, struct pt_regs *regs); +extern irqreturn_t vidc_sound_dma_irq(int irqnr, void *ref, struct pt_regs *regs); /* * Filler routine pointer diff --git a/sound/oss/vidc_fill.S b/sound/oss/vidc_fill.S index 28e57737330e9..e8030cf0e3c8d 100644 --- a/sound/oss/vidc_fill.S +++ b/sound/oss/vidc_fill.S @@ -133,6 +133,10 @@ ENTRY(vidc_clear) * ip = corrupted */ +%%%%%%%%%%%%%%%%%%% +fixme! This funtion needs to return IRQ_HANDLED +%%%%%%%%%%%%%%%%%%% + ENTRY(vidc_sound_dma_irq) stmfd sp!, {r4 - r8, lr} ldr r8, =dma_start diff --git a/sound/oss/vwsnd.c b/sound/oss/vwsnd.c index f66c96c874613..0d4429f1c1db8 100644 --- a/sound/oss/vwsnd.c +++ b/sound/oss/vwsnd.c @@ -2236,7 +2236,7 @@ static void vwsnd_audio_write_intr(vwsnd_dev_t *devc, unsigned int status) pcm_output(devc, underflown, 0); } -static void vwsnd_audio_intr(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t vwsnd_audio_intr(int irq, void *dev_id, struct pt_regs *regs) { vwsnd_dev_t *devc = (vwsnd_dev_t *) dev_id; unsigned int status; @@ -2246,6 +2246,7 @@ static void vwsnd_audio_intr(int irq, void *dev_id, struct pt_regs *regs) status = li_get_clear_intr_status(&devc->lith); vwsnd_audio_read_intr(devc, status); vwsnd_audio_write_intr(devc, status); + return IRQ_HANDLED; } static ssize_t vwsnd_audio_do_read(struct file *file, diff --git a/sound/oss/waveartist.c b/sound/oss/waveartist.c index c38833215effb..aa2f1d9607e01 100644 --- a/sound/oss/waveartist.c +++ b/sound/oss/waveartist.c @@ -833,7 +833,7 @@ static struct audio_driver waveartist_audio_driver = { }; -static void +static irqreturn_t waveartist_intr(int irq, void *dev_id, struct pt_regs *regs) { wavnc_info *devc = (wavnc_info *)dev_id; @@ -872,6 +872,7 @@ waveartist_intr(int irq, void *dev_id, struct pt_regs *regs) // We do not use SB mode natively... printk(KERN_WARNING "waveartist: Unexpected SB interrupt...\n"); spin_unlock(&waveartist_lock); + return IRQ_HANDLED; } /* ------------------------------------------------------------------------- diff --git a/sound/oss/wavfront.c b/sound/oss/wavfront.c index b79a57cfd48f3..a79d87cac85d3 100644 --- a/sound/oss/wavfront.c +++ b/sound/oss/wavfront.c @@ -2123,8 +2123,8 @@ static void __exit unload_wavefront (struct address_info *hw_config) /* WaveFront: Linux modular sound kernel installation interface */ /***********************************************************************/ -void -wavefrontintr (int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t +wavefrontintr(int irq, void *dev_id, struct pt_regs *dummy) { struct wf_config *hw = dev_id; @@ -2149,12 +2149,13 @@ wavefrontintr (int irq, void *dev_id, struct pt_regs *dummy) */ if ((wavefront_status() & (STAT_INTR_READ|STAT_INTR_WRITE)) == 0) { - return; + return IRQ_NONE; } hw->irq_ok = 1; hw->irq_cnt++; wake_up_interruptible (&hw->interrupt_sleeper); + return IRQ_HANDLED; } /* STATUS REGISTER diff --git a/sound/oss/wf_midi.c b/sound/oss/wf_midi.c index 2a005d3bb3603..e7daf0215c446 100644 --- a/sound/oss/wf_midi.c +++ b/sound/oss/wf_midi.c @@ -354,8 +354,8 @@ wf_mpu_input_scanner (int devno, int synthdev, unsigned char midic) return 1; } -void -wf_mpuintr (int irq, void *dev_id, struct pt_regs *dummy) +static irqreturn_t +wf_mpuintr(int irq, void *dev_id, struct pt_regs *dummy) { struct wf_mpu_config *physical_dev = dev_id; @@ -364,10 +364,11 @@ wf_mpuintr (int irq, void *dev_id, struct pt_regs *dummy) int n; if (!input_avail()) { /* not for us */ - return; + return IRQ_NONE; } - if (mi->m_busy) return; + if (mi->m_busy) + return IRQ_HANDLED; spin_lock(&lock); mi->m_busy = 1; @@ -410,6 +411,7 @@ wf_mpuintr (int irq, void *dev_id, struct pt_regs *dummy) mi->m_busy = 0; spin_unlock(&lock); + return IRQ_HANDLED; } static int diff --git a/sound/oss/ymfpci.c b/sound/oss/ymfpci.c index c3716ea2181c3..66eedb95681e8 100644 --- a/sound/oss/ymfpci.c +++ b/sound/oss/ymfpci.c @@ -1016,7 +1016,7 @@ static int ymf_capture_prepare(struct ymf_state *state) return 0; } -void ymf_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t ymf_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ymfpci_t *codec = dev_id; u32 status, nvoice, mode; @@ -1050,6 +1050,7 @@ void ymf_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* timer handler */ ymfpci_writel(codec, YDSXGR_INTFLAG, ~0); } + return IRQ_HANDLED; } static void ymf_pcm_free_substream(struct ymf_pcm *ypcm) diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index b9c340b45c29a..691a0711f01da 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c @@ -1032,15 +1032,16 @@ static void snd_ali_interrupt(ali_t * codec) } -static void snd_ali_card_interrupt(int irq, +static irqreturn_t snd_ali_card_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ali_t *codec = snd_magic_cast(ali_t, dev_id, return); if (codec == NULL) - return; + return IRQ_NONE; snd_ali_interrupt(codec); + return IRQ_HANDLED; } diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index ca0a7593f0eea..4621df9e171e6 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -356,7 +356,7 @@ static snd_pcm_uframes_t snd_als4000_playback_pointer(snd_pcm_substream_t * subs return bytes_to_frames( substream->runtime, result ); } -static void snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sb_t *chip = snd_magic_cast(sb_t, dev_id, return); unsigned long flags; @@ -387,6 +387,7 @@ static void snd_als4000_interrupt(int irq, void *dev_id, struct pt_regs *regs) inb(chip->mpu_port); if (sb_status & 0x20) inb(SBP(chip, RESET)); + return IRQ_HANDLED; } /*****************************************************************/ diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index bbf17e0a3f711..ab02dae115eab 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -1640,7 +1640,7 @@ static int snd_cmipci_capture_spdif_hw_free(snd_pcm_substream_t *subs) /* * interrupt handler */ -static void snd_cmipci_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cmipci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cmipci_t *cm = snd_magic_cast(cmipci_t, dev_id, return); unsigned int status, mask = 0; @@ -1648,7 +1648,7 @@ static void snd_cmipci_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* fastpath out, to ease interrupt sharing */ status = snd_cmipci_read(cm, CM_REG_INT_STATUS); if (!(status & CM_INTR)) - return; + return IRQ_NONE; /* acknowledge interrupt */ spin_lock(&cm->reg_lock); @@ -1669,6 +1669,7 @@ static void snd_cmipci_interrupt(int irq, void *dev_id, struct pt_regs *regs) if ((status & CM_CHINT1) && cm->channel[1].running) snd_pcm_period_elapsed(cm->channel[1].substream); } + return IRQ_HANDLED; } /* diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index 6b3be4891d573..edda17920ab11 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c @@ -511,7 +511,7 @@ struct snd_cs4281 { }; -static void snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs); static struct pci_device_id snd_cs4281_ids[] __devinitdata = { { 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4281 */ @@ -1883,18 +1883,18 @@ static int __devinit snd_cs4281_midi(cs4281_t * chip, int device, snd_rawmidi_t * Interrupt handler */ -static void snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs4281_t *chip = snd_magic_cast(cs4281_t, dev_id, return); unsigned int status, dma, val; cs4281_dma_t *cdma; if (chip == NULL) - return; + return IRQ_NONE; status = snd_cs4281_peekBA0(chip, BA0_HISR); if ((status & 0x7fffffff) == 0) { snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI); - return; + return IRQ_HANDLED; } if (status & (BA0_HISR_DMA(0)|BA0_HISR_DMA(1)|BA0_HISR_DMA(2)|BA0_HISR_DMA(3))) { @@ -1949,6 +1949,7 @@ static void snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* EOI to the PCI part... reenables interrupts */ snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI); + return IRQ_HANDLED; } diff --git a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c index 6f1a5618bc9bc..19fc0171bf28d 100644 --- a/sound/pci/cs46xx/cs46xx_lib.c +++ b/sound/pci/cs46xx/cs46xx_lib.c @@ -1217,7 +1217,7 @@ static int snd_cs46xx_capture_prepare(snd_pcm_substream_t * substream) return 0; } -static void snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs46xx_t *chip = snd_magic_cast(cs46xx_t, dev_id, return); u32 status1; @@ -1234,7 +1234,7 @@ static void snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) status1 = snd_cs46xx_peekBA0(chip, BA0_HISR); if ((status1 & 0x7fffffff) == 0) { snd_cs46xx_pokeBA0(chip, BA0_HICR, HICR_CHGM | HICR_IEV); - return; + return IRQ_HANDLED; } #ifdef CONFIG_SND_CS46XX_NEW_DSP @@ -1305,6 +1305,7 @@ static void snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) * EOI to the PCI part....reenables interrupts */ snd_cs46xx_pokeBA0(chip, BA0_HICR, HICR_CHGM | HICR_IEV); + return IRQ_HANDLED; } static snd_pcm_hardware_t snd_cs46xx_playback = diff --git a/sound/pci/emu10k1/irq.c b/sound/pci/emu10k1/irq.c index 00c5b0798041d..7250c1374b02c 100644 --- a/sound/pci/emu10k1/irq.c +++ b/sound/pci/emu10k1/irq.c @@ -30,13 +30,15 @@ #include #include -void snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) +irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) { emu10k1_t *emu = snd_magic_cast(emu10k1_t, dev_id, return); unsigned int status; + int handled = 0; while ((status = inl(emu->port + IPR)) != 0) { // printk("irq - status = 0x%x\n", status); + handled = 1; if (status & IPR_PCIERROR) { snd_printk("interrupt: PCI error\n"); snd_emu10k1_intr_disable(emu, INTE_PCIERRORENABLE); @@ -145,4 +147,5 @@ void snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs) outl(IPR_FXDSP, emu->port + IPR); } } + return IRQ_RETVAL(handled); } diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c index 5cf49ce8db431..dcbc81e189d2d 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c @@ -249,7 +249,7 @@ struct _snd_es1938 { #endif }; -static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs); static struct pci_device_id snd_es1938_ids[] __devinitdata = { { 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Solo-1 */ @@ -1490,10 +1490,11 @@ static int __devinit snd_es1938_create(snd_card_t * card, /* -------------------------------------------------------------------- * Interrupt handler * -------------------------------------------------------------------- */ -static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es1938_t *chip = snd_magic_cast(es1938_t, dev_id, return); unsigned char status, audiostatus; + int handled = 0; status = inb(SLIO_REG(chip, IRQCONTROL)); #if 0 @@ -1509,6 +1510,7 @@ static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) printk("Es1938debug - AUDIO channel 1 DMAC DMA status: 0x%x\n", inl(SLDM_REG(chip, DMASTATUS))); #endif /* clear irq */ + handled = 1; audiostatus = inb(SLSB_REG(chip, STATUS)); if (chip->active & ADC1) snd_pcm_period_elapsed(chip->capture_substream); @@ -1525,6 +1527,7 @@ static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) #endif /* clear irq */ + handled = 1; snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0); if (chip->active & DAC2) snd_pcm_period_elapsed(chip->playback1_substream); @@ -1533,6 +1536,7 @@ static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* Hardware volume */ if (status & 0x40) { int split = snd_es1938_mixer_read(chip, 0x64) & 0x80; + handled = 1; snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id); snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id); if (!split) { @@ -1546,9 +1550,12 @@ static void snd_es1938_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* MPU401 */ if (status & 0x80) { // snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */ - if (chip->rmidi) + if (chip->rmidi) { + handled = 1; snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); + } } + return IRQ_RETVAL(handled); } #define ES1938_DMA_SIZE 64 diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index 885e1cc21d5ab..9ae5c1953293a 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c @@ -600,7 +600,7 @@ struct snd_es1968 { #endif }; -static void snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs); static struct pci_device_id snd_es1968_ids[] __devinitdata = { /* Maestro 1 */ @@ -2009,13 +2009,13 @@ static void es1968_update_hw_volume(unsigned long private_data) /* * interrupt handler */ -static void snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs) { es1968_t *chip = snd_magic_cast(es1968_t, dev_id, return); u32 event; if (!(event = inb(chip->io_port + 0x1A))) - return; + return IRQ_NONE; outw(inw(chip->io_port + 4) & 1, chip->io_port + 4); @@ -2041,6 +2041,7 @@ static void snd_es1968_interrupt(int irq, void *dev_id, struct pt_regs *regs) } spin_unlock(&chip->substream_lock); } + return IRQ_HANDLED; } /* diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index 948aa8793be81..c0b0287a63abc 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c @@ -481,7 +481,7 @@ static snd_pcm_uframes_t snd_fm801_capture_pointer(snd_pcm_substream_t * substre return bytes_to_frames(substream->runtime, ptr); } -static void snd_fm801_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_fm801_interrupt(int irq, void *dev_id, struct pt_regs *regs) { fm801_t *chip = snd_magic_cast(fm801_t, dev_id, return); unsigned short status; @@ -490,7 +490,7 @@ static void snd_fm801_interrupt(int irq, void *dev_id, struct pt_regs *regs) status = inw(FM801_REG(chip, IRQ_STATUS)); status &= FM801_IRQ_PLAYBACK|FM801_IRQ_CAPTURE|FM801_IRQ_MPU|FM801_IRQ_VOLUME; if (! status) - return; + return IRQ_NONE; /* ack first */ outw(status, FM801_REG(chip, IRQ_STATUS)); if (chip->pcm && (status & FM801_IRQ_PLAYBACK) && chip->playback_substream) { @@ -525,6 +525,7 @@ static void snd_fm801_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); if (status & FM801_IRQ_VOLUME) ;/* TODO */ + return IRQ_HANDLED; } static snd_pcm_hardware_t snd_fm801_playback = diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index 2f1a5951eb153..1e085b142770a 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c @@ -398,15 +398,17 @@ int __devinit snd_ice1712_init_cs8427(ice1712_t *ice, int addr) * Interrupt handler */ -static void snd_ice1712_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_ice1712_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ice1712_t *ice = snd_magic_cast(ice1712_t, dev_id, return); unsigned char status; + int handled = 0; while (1) { status = inb(ICEREG(ice, IRQSTAT)); if (status == 0) break; + handled = 1; if (status & ICE1712_IRQ_MPU1) { if (ice->rmidi[0]) snd_mpu401_uart_interrupt(irq, ice->rmidi[0]->private_data, regs); @@ -462,6 +464,7 @@ static void snd_ice1712_interrupt(int irq, void *dev_id, struct pt_regs *regs) outb(ICE1712_IRQ_CONPBK, ICEREG(ice, IRQSTAT)); } } + return IRQ_RETVAL(handled); } diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index 4e8e6f501033f..dc73d2f7bc46e 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -194,16 +194,18 @@ static unsigned int snd_vt1724_get_gpio_data(ice1712_t *ice) * Interrupt handler */ -static void snd_vt1724_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ice1712_t *ice = snd_magic_cast(ice1712_t, dev_id, return); unsigned char status; + int handled = 0; while (1) { status = inb(ICEREG1724(ice, IRQSTAT)); if (status == 0) break; - + + handled = 1; /* these should probably be separated at some point, but as we don't currently have MPU support on the board I will leave it */ if ((status & VT1724_IRQ_MPU_RX)||(status & VT1724_IRQ_MPU_TX)) { @@ -242,6 +244,7 @@ static void snd_vt1724_interrupt(int irq, void *dev_id, struct pt_regs *regs) } } + return IRQ_RETVAL(handled); } /* diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c index c00f216449691..664c89794afd8 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c @@ -1133,18 +1133,18 @@ static void snd_korg1212_OnDSPDownloadComplete(korg1212_t *korg1212) snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_COMPLETE); } -static void snd_korg1212_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_korg1212_interrupt(int irq, void *dev_id, struct pt_regs *regs) { u32 doorbellValue; korg1212_t *korg1212 = snd_magic_cast(korg1212_t, dev_id, return); if(irq != korg1212->irq) - return; + return IRQ_NONE; doorbellValue = readl(korg1212->inDoorbellPtr); if (!doorbellValue) - return; + return IRQ_HANDLED; spin_lock(&korg1212->lock); @@ -1218,6 +1218,7 @@ static void snd_korg1212_interrupt(int irq, void *dev_id, struct pt_regs *regs) korg1212->inIRQ--; spin_unlock(&korg1212->lock); + return IRQ_HANDLED; } static int snd_korg1212_downloadDSPCode(korg1212_t *korg1212) diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 670151d213f2c..daac7252b537d 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c @@ -1549,7 +1549,7 @@ static void snd_m3_update_ptr(m3_t *chip, m3_dma_t *s) } } -static void +static irqreturn_t snd_m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) { m3_t *chip = snd_magic_cast(m3_t, dev_id, ); @@ -1559,7 +1559,7 @@ snd_m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) status = inb(chip->iobase + 0x1A); if (status == 0xff) - return; + return IRQ_NONE; /* presumably acking the ints? */ outw(status, chip->iobase + 0x1A); @@ -1592,6 +1592,7 @@ snd_m3_interrupt(int irq, void *dev_id, struct pt_regs *regs) /* XXX is this needed? */ if (status & 0x40) outb(0x40, chip->iobase+0x1A); + return IRQ_HANDLED; } diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index 34ce592feda4b..8a3aefc87fc0a 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c @@ -238,7 +238,7 @@ struct snd_nm256 { int mixer_status_mask; /* bit mask to test the mixer status */ int irq; - void (*interrupt)(int, void *, struct pt_regs *); + irqreturn_t (*interrupt)(int, void *, struct pt_regs *); int badintrcount; /* counter to check bogus interrupts */ nm256_stream_t streams[2]; @@ -972,7 +972,7 @@ snd_nm256_intr_check(nm256_t *chip) * I suppose...yucky bleah.) */ -static void +static irqreturn_t snd_nm256_interrupt(int irq, void *dev_id, struct pt_regs *dummy) { nm256_t *chip = snd_magic_cast(nm256_t, dev_id, return); @@ -984,7 +984,7 @@ snd_nm256_interrupt(int irq, void *dev_id, struct pt_regs *dummy) /* Not ours. */ if (status == 0) { snd_nm256_intr_check(chip); - return; + return IRQ_NONE; } chip->badintrcount = 0; @@ -1030,6 +1030,7 @@ snd_nm256_interrupt(int irq, void *dev_id, struct pt_regs *dummy) } spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } /* @@ -1038,7 +1039,7 @@ snd_nm256_interrupt(int irq, void *dev_id, struct pt_regs *dummy) * routine. */ -static void +static irqreturn_t snd_nm256_interrupt_zx(int irq, void *dev_id, struct pt_regs *dummy) { nm256_t *chip = snd_magic_cast(nm256_t, dev_id, return); @@ -1050,7 +1051,7 @@ snd_nm256_interrupt_zx(int irq, void *dev_id, struct pt_regs *dummy) /* Not ours. */ if (status == 0) { snd_nm256_intr_check(chip); - return; + return IRQ_NONE; } chip->badintrcount = 0; @@ -1095,6 +1096,7 @@ snd_nm256_interrupt_zx(int irq, void *dev_id, struct pt_regs *dummy) } spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } /* diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index b4074034acee2..175cb05524af5 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c @@ -833,14 +833,14 @@ static void snd_rme32_capture_stop(rme32_t * rme32) writel(rme32->wcreg, rme32->iobase + RME32_IO_CONTROL_REGISTER); } -static void +static irqreturn_t snd_rme32_interrupt(int irq, void *dev_id, struct pt_regs *regs) { rme32_t *rme32 = (rme32_t *) dev_id; rme32->rcreg = readl(rme32->iobase + RME32_IO_CONTROL_REGISTER); if (!(rme32->rcreg & RME32_RCR_IRQ)) { - return; + return IRQ_NONE; } else { if (rme32->capture_substream) { snd_pcm_period_elapsed(rme32->capture_substream); @@ -850,6 +850,7 @@ snd_rme32_interrupt(int irq, void *dev_id, struct pt_regs *regs) } writel(0, rme32->iobase + RME32_IO_CONFIRM_ACTION_IRQ); } + return IRQ_HANDLED; } static unsigned int period_bytes[] = { RME32_BLOCK_SIZE }; diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index dcac1270adf2d..dac0df2f2f619 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c @@ -1153,7 +1153,7 @@ snd_rme96_capture_stop(rme96_t *rme96) writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER); } -static void +static irqreturn_t snd_rme96_interrupt(int irq, void *dev_id, struct pt_regs *regs) @@ -1165,7 +1165,7 @@ snd_rme96_interrupt(int irq, if (!((rme96->rcreg & RME96_RCR_IRQ) || (rme96->rcreg & RME96_RCR_IRQ_2))) { - return; + return IRQ_NONE; } if (rme96->rcreg & RME96_RCR_IRQ) { @@ -1178,6 +1178,7 @@ snd_rme96_interrupt(int irq, snd_pcm_period_elapsed(rme96->capture_substream); writel(0, rme96->iobase + RME96_IO_CONFIRM_REC_IRQ); } + return IRQ_HANDLED; } static unsigned int period_bytes[] = { RME96_SMALL_BLOCK_SIZE, RME96_LARGE_BLOCK_SIZE }; diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index 2847b415506d8..455385b315132 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c @@ -3076,7 +3076,7 @@ void hdsp_midi_tasklet(unsigned long arg) } } -void snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { hdsp_t *hdsp = (hdsp_t *) dev_id; unsigned int status; @@ -3094,7 +3094,7 @@ void snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) midi1 = status & HDSP_midi1IRQPending; if (!audio && !midi0 && !midi1) { - return; + return IRQ_NONE; } hdsp_write(hdsp, HDSP_interruptConfirmation, 0); @@ -3128,6 +3128,7 @@ void snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs) } if (schedule) tasklet_hi_schedule(&hdsp->midi_tasklet); + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_hdsp_hw_pointer(snd_pcm_substream_t *substream) diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c index 0d4099ff6a7d8..c413f5b0b843e 100644 --- a/sound/pci/rme9652/rme9652.c +++ b/sound/pci/rme9652/rme9652.c @@ -1947,12 +1947,12 @@ static void snd_rme9652_set_defaults(rme9652_t *rme9652) rme9652_set_rate(rme9652, 48000); } -void snd_rme9652_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_rme9652_interrupt(int irq, void *dev_id, struct pt_regs *regs) { rme9652_t *rme9652 = (rme9652_t *) dev_id; if (!(rme9652_read(rme9652, RME9652_status_register) & RME9652_IRQ)) { - return; + return IRQ_NONE; } rme9652_write(rme9652, RME9652_irq_clear, 0); @@ -1964,6 +1964,7 @@ void snd_rme9652_interrupt(int irq, void *dev_id, struct pt_regs *regs) if (rme9652->playback_substream) { snd_pcm_period_elapsed(rme9652->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream); } + return IRQ_HANDLED; } static snd_pcm_uframes_t snd_rme9652_hw_pointer(snd_pcm_substream_t *substream) diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c index 2dfff68d791ef..03248c60c874b 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c @@ -596,18 +596,18 @@ static int snd_sonicvibes_trigger(sonicvibes_t * sonic, int what, int cmd) return result; } -static void snd_sonicvibes_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_sonicvibes_interrupt(int irq, void *dev_id, struct pt_regs *regs) { sonicvibes_t *sonic = snd_magic_cast(sonicvibes_t, dev_id, return); unsigned char status; status = inb(SV_REG(sonic, STATUS)); if (!(status & (SV_DMAA_IRQ | SV_DMAC_IRQ | SV_MIDI_IRQ))) - return; + return IRQ_NONE; if (status == 0xff) { /* failure */ outb(sonic->irqmask = ~0, SV_REG(sonic, IRQMASK)); snd_printk("IRQ failure - interrupts disabled!!\n"); - return; + return IRQ_HANDLED; } if (sonic->pcm) { if (status & SV_DMAA_IRQ) @@ -654,6 +654,7 @@ static void snd_sonicvibes_interrupt(int irq, void *dev_id, struct pt_regs *regs snd_ctl_notify(sonic->card, SNDRV_CTL_EVENT_MASK_VALUE, &sonic->master_mute->id); snd_ctl_notify(sonic->card, SNDRV_CTL_EVENT_MASK_VALUE, &sonic->master_volume->id); } + return IRQ_HANDLED; } /* diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c index e2aff9e722a7a..658a9c80be2b1 100644 --- a/sound/pci/trident/trident_main.c +++ b/sound/pci/trident/trident_main.c @@ -48,7 +48,7 @@ static int snd_trident_pcm_mixer_build(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream); static int snd_trident_pcm_mixer_free(trident_t *trident, snd_trident_voice_t * voice, snd_pcm_substream_t *substream); -static void snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs); #ifdef CONFIG_PM static int snd_trident_set_power_state(snd_card_t *card, unsigned int power_state); #endif @@ -3687,7 +3687,7 @@ int snd_trident_free(trident_t *trident) ---------------------------------------------------------------------------*/ -static void snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) { trident_t *trident = snd_magic_cast(trident_t, dev_id, return); unsigned int audio_int, chn_int, stimer, channel, mask, tmp; @@ -3696,7 +3696,7 @@ static void snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) audio_int = inl(TRID_REG(trident, T4D_MISCINT)); if ((audio_int & (ADDRESS_IRQ|MPU401_IRQ)) == 0) - return; + return IRQ_NONE; if (audio_int & ADDRESS_IRQ) { // get interrupt status for all channels spin_lock(&trident->reg_lock); @@ -3781,6 +3781,7 @@ static void snd_trident_interrupt(int irq, void *dev_id, struct pt_regs *regs) } } // outl((ST_TARGET_REACHED | MIXER_OVERFLOW | MIXER_UNDERFLOW), TRID_REG(trident, T4D_MISCINT)); + return IRQ_HANDLED; } /*--------------------------------------------------------------------------- diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index f0ec3188f401a..fde64b90da188 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -574,7 +574,7 @@ static void snd_via82xx_channel_reset(via82xx_t *chip, viadev_t *viadev) * Interrupt handler */ -static void snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) { via82xx_t *chip = snd_magic_cast(via82xx_t, dev_id, return); unsigned int status; @@ -591,8 +591,8 @@ static void snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) spin_unlock(&chip->reg_lock); if (chip->rmidi) /* check mpu401 interrupt */ - snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); - return; + return snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); + return IRQ_NONE; } // _skip_sgd: @@ -611,6 +611,7 @@ static void snd_via82xx_interrupt(int irq, void *dev_id, struct pt_regs *regs) outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */ } spin_unlock(&chip->reg_lock); + return IRQ_HANDLED; } /* diff --git a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c index 42dd52b2f0814..4fdbb29519460 100644 --- a/sound/pci/ymfpci/ymfpci_main.c +++ b/sound/pci/ymfpci/ymfpci_main.c @@ -741,7 +741,7 @@ static void snd_ymfpci_irq_wait(ymfpci_t *chip) } } -static void snd_ymfpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_ymfpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { ymfpci_t *chip = snd_magic_cast(ymfpci_t, dev_id, return); u32 status, nvoice, mode; @@ -787,6 +787,7 @@ static void snd_ymfpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) if (chip->rawmidi) snd_mpu401_uart_interrupt(irq, chip->rawmidi->private_data, regs); + return IRQ_HANDLED; } static snd_pcm_hardware_t snd_ymfpci_playback = diff --git a/sound/ppc/pmac.c b/sound/ppc/pmac.c index 74931580c8a73..d6b4bac01bf11 100644 --- a/sound/ppc/pmac.c +++ b/sound/ppc/pmac.c @@ -693,23 +693,25 @@ static void snd_pmac_dbdma_reset(pmac_t *chip) /* * interrupt handlers */ -static void +static irqreturn_t snd_pmac_tx_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); snd_pmac_pcm_update(chip, &chip->playback); + return IRQ_HANDLED; } -static void +static irqreturn_t snd_pmac_rx_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); snd_pmac_pcm_update(chip, &chip->capture); + return IRQ_HANDLED; } -static void +static irqreturn_t snd_pmac_ctrl_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); @@ -728,6 +730,7 @@ snd_pmac_ctrl_intr(int irq, void *devid, struct pt_regs *regs) } /* Writing 1s to the CNTLERR and PORTCHG bits clears them... */ out_le32(&chip->awacs->control, ctrl); + return IRQ_HANDLED; } diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c index 775d4e02b342a..7834b1651f271 100644 --- a/sound/ppc/tumbler.c +++ b/sound/ppc/tumbler.c @@ -785,11 +785,14 @@ static void tumbler_update_automute(pmac_t *chip, int do_notify) /* interrupt - headphone plug changed */ -static void headphone_intr(int irq, void *devid, struct pt_regs *regs) +static irqreturn_t headphone_intr(int irq, void *devid, struct pt_regs *regs) { pmac_t *chip = snd_magic_cast(pmac_t, devid, return); - if (chip->update_automute && chip->initialized) + if (chip->update_automute && chip->initialized) { chip->update_automute(chip, 1); + return IRQ_HANDLED; + } + return IRQ_NONE; } /* look for audio-gpio device */ diff --git a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c index 38cd35321dfe8..83b0c5351c42e 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -497,7 +497,7 @@ static void __amd7930_update_map(amd7930_t *amd) __amd7930_write_map(amd); } -static void snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *regs) { amd7930_t *amd = dev_id; unsigned int elapsed; @@ -536,6 +536,7 @@ static void snd_amd7930_interrupt(int irq, void *dev_id, struct pt_regs *regs) snd_pcm_period_elapsed(amd->playback_substream); else snd_pcm_period_elapsed(amd->capture_substream); + return IRQ_HANDLED; } static int snd_amd7930_trigger(amd7930_t *amd, unsigned int flag, int cmd) diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index ee9b28117ac23..667e326d34cbf 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -1228,7 +1228,7 @@ static void snd_cs4231_generic_interrupt(cs4231_t *chip) } #ifdef SBUS_SUPPORT -static void snd_cs4231_sbus_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t snd_cs4231_sbus_interrupt(int irq, void *dev_id, struct pt_regs *regs) { cs4231_t *chip = snd_magic_cast(cs4231_t, dev_id, return); u32 csr; @@ -1240,12 +1240,13 @@ static void snd_cs4231_sbus_interrupt(int irq, void *dev_id, struct pt_regs *reg APC_GENL_INT | APC_XINT_PEMP | APC_XINT_CEMP))) - return; + return IRQ_NONE; /* ACK the APC interrupt. */ sbus_writel(csr, chip->port + APCCSR); snd_cs4231_generic_interrupt(chip); + return IRQ_HANDLED; } #endif -- 2.53.0