From 0246417de28749b5d8feeb62a12d6752e90777dd Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 20 Apr 2003 20:18:53 -0700 Subject: [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 ++++--- 8 files changed, 16 insertions(+), 10 deletions(-) (limited to 'include') diff --git a/include/sound/ad1848.h b/include/sound/ad1848.h index 155fa2b6ec0f..55be82f4599b 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 75d1b588ee87..af643468893f 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 4161dfd1f2b3..73b0b3935275 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 40967507892c..104bb9b022cc 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 a896bf9ff626..6cd0a22527f4 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 016151a49a9b..31e045d389b7 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 3ae91b26b061..c5faba67aa26 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 7815b9200d35..aa7d892912aa 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); -- cgit v1.2.3 From ae19bc780fa2ed785e81e8c8efc67dd0119953a6 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 20 Apr 2003 20:20:56 -0700 Subject: [PATCH] parport_serial fix parport_serial is calling a couple of 8250 driver functions with no prototypes in scope. Turns out it was calling them with too many args, too. --- drivers/parport/parport_serial.c | 5 +++-- drivers/serial/8250_pci.c | 1 + include/linux/8250_pci.h | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 include/linux/8250_pci.h (limited to 'include') diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c index f80f9301314d..536337c77cb8 100644 --- a/drivers/parport/parport_serial.c +++ b/drivers/parport/parport_serial.c @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -150,12 +151,12 @@ struct pci_board_no_ids { static int __devinit siig10x_init_fn(struct pci_dev *dev, struct pci_board_no_ids *board, int enable) { - return pci_siig10x_fn(dev, NULL, enable); + return pci_siig10x_fn(dev, enable); } static int __devinit siig20x_init_fn(struct pci_dev *dev, struct pci_board_no_ids *board, int enable) { - return pci_siig20x_fn(dev, NULL, enable); + return pci_siig20x_fn(dev, enable); } static struct pci_board_no_ids pci_boards[] __devinitdata = { diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index 954a362b4f07..d9e97644862e 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include diff --git a/include/linux/8250_pci.h b/include/linux/8250_pci.h new file mode 100644 index 000000000000..5f3ab21b339b --- /dev/null +++ b/include/linux/8250_pci.h @@ -0,0 +1,2 @@ +int pci_siig10x_fn(struct pci_dev *dev, int enable); +int pci_siig20x_fn(struct pci_dev *dev, int enable); -- cgit v1.2.3 From 4d74063ef7399f13e5f940260d564731ceec5ee5 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 20 Apr 2003 20:21:28 -0700 Subject: [PATCH] irqs: input drivers Update the input and joystick drivers to the new IRQ API. --- drivers/input/joystick/iforce/iforce-serio.c | 30 ++++++++++++++-------------- drivers/input/joystick/magellan.c | 6 ++++-- drivers/input/joystick/spaceball.c | 10 ++++++---- drivers/input/joystick/spaceorb.c | 4 +++- drivers/input/joystick/stinger.c | 5 +++-- drivers/input/joystick/warrior.c | 4 +++- drivers/input/keyboard/atkbd.c | 26 ++++++++++++++---------- drivers/input/keyboard/newtonkbd.c | 4 +++- drivers/input/keyboard/sunkbd.c | 15 ++++++++------ drivers/input/keyboard/xtkbd.c | 8 +++++--- drivers/input/mouse/inport.c | 5 +++-- drivers/input/mouse/logibm.c | 5 +++-- drivers/input/mouse/pc110pad.c | 3 ++- drivers/input/mouse/psmouse.c | 15 ++++++++------ drivers/input/mouse/sermouse.c | 4 +++- drivers/input/serio/ct82c710.c | 6 +++--- drivers/input/serio/serio.c | 19 ++++++++++++------ drivers/input/touchscreen/gunze.c | 6 ++++-- include/linux/serio.h | 6 ++++-- 19 files changed, 110 insertions(+), 71 deletions(-) (limited to 'include') diff --git a/drivers/input/joystick/iforce/iforce-serio.c b/drivers/input/joystick/iforce/iforce-serio.c index 7037ded74577..e17c2e8a5aa0 100644 --- a/drivers/input/joystick/iforce/iforce-serio.c +++ b/drivers/input/joystick/iforce/iforce-serio.c @@ -78,40 +78,38 @@ static void iforce_serio_write_wakeup(struct serio *serio) iforce_serial_xmit((struct iforce *)serio->private); } -static void iforce_serio_irq(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t iforce_serio_irq(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct iforce* iforce = serio->private; if (!iforce->pkt) { - if (data != 0x2b) { - return; - } - iforce->pkt = 1; - return; + if (data == 0x2b) + iforce->pkt = 1; + goto out; } if (!iforce->id) { - if (data > 3 && data != 0xff) { + if (data > 3 && data != 0xff) iforce->pkt = 0; - return; - } - iforce->id = data; - return; + else + iforce->id = data; + goto out; } if (!iforce->len) { if (data > IFORCE_MAX_LENGTH) { iforce->pkt = 0; iforce->id = 0; - return; + } else { + iforce->len = data; } - iforce->len = data; - return; + goto out; } if (iforce->idx < iforce->len) { iforce->csum += iforce->data[iforce->idx++] = data; - return; + goto out; } if (iforce->idx == iforce->len) { @@ -122,6 +120,8 @@ static void iforce_serio_irq(struct serio *serio, unsigned char data, unsigned i iforce->idx = 0; iforce->csum = 0; } +out: + return IRQ_HANDLED; } static void iforce_serio_connect(struct serio *serio, struct serio_dev *dev) diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c index 203f13b4be14..992511d830e5 100644 --- a/drivers/input/joystick/magellan.c +++ b/drivers/input/joystick/magellan.c @@ -113,7 +113,8 @@ static void magellan_process_packet(struct magellan* magellan, struct pt_regs *r input_sync(dev); } -static void magellan_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t magellan_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct magellan* magellan = serio->private; @@ -123,7 +124,8 @@ static void magellan_interrupt(struct serio *serio, unsigned char data, unsigned } else { if (magellan->idx < MAGELLAN_MAX_LENGTH) magellan->data[magellan->idx++] = data; - } + } + return IRQ_HANDLED; } /* diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c index c2ecf93cc396..4e288b58c9b2 100644 --- a/drivers/input/joystick/spaceball.c +++ b/drivers/input/joystick/spaceball.c @@ -149,7 +149,8 @@ static void spaceball_process_packet(struct spaceball* spaceball, struct pt_regs * can occur in the axis values. */ -static void spaceball_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t spaceball_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct spaceball *spaceball = serio->private; @@ -158,11 +159,11 @@ static void spaceball_interrupt(struct serio *serio, unsigned char data, unsigne spaceball_process_packet(spaceball, regs); spaceball->idx = 0; spaceball->escape = 0; - return; + break; case '^': if (!spaceball->escape) { spaceball->escape = 1; - return; + break; } spaceball->escape = 0; case 'M': @@ -177,8 +178,9 @@ static void spaceball_interrupt(struct serio *serio, unsigned char data, unsigne spaceball->escape = 0; if (spaceball->idx < SPACEBALL_MAX_LENGTH) spaceball->data[spaceball->idx++] = data; - return; + break; } + return IRQ_HANDLED; } /* diff --git a/drivers/input/joystick/spaceorb.c b/drivers/input/joystick/spaceorb.c index 3c59a6316d70..593dcac96519 100644 --- a/drivers/input/joystick/spaceorb.c +++ b/drivers/input/joystick/spaceorb.c @@ -130,7 +130,8 @@ static void spaceorb_process_packet(struct spaceorb *spaceorb, struct pt_regs *r input_sync(dev); } -static void spaceorb_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t spaceorb_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct spaceorb* spaceorb = serio->private; @@ -140,6 +141,7 @@ static void spaceorb_interrupt(struct serio *serio, unsigned char data, unsigned } if (spaceorb->idx < SPACEORB_MAX_LENGTH) spaceorb->data[spaceorb->idx++] = data & 0x7f; + return IRQ_HANDLED; } /* diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c index 3f47b345aa4b..f68d3add2300 100644 --- a/drivers/input/joystick/stinger.c +++ b/drivers/input/joystick/stinger.c @@ -98,7 +98,8 @@ static void stinger_process_packet(struct stinger *stinger, struct pt_regs *regs * packet processing routine. */ -static void stinger_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t stinger_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct stinger* stinger = serio->private; @@ -112,7 +113,7 @@ static void stinger_interrupt(struct serio *serio, unsigned char data, unsigned stinger->idx = 0; } - return; + return IRQ_HANDLED; } /* diff --git a/drivers/input/joystick/warrior.c b/drivers/input/joystick/warrior.c index 7509892f2430..426ce2d5e5cf 100644 --- a/drivers/input/joystick/warrior.c +++ b/drivers/input/joystick/warrior.c @@ -99,7 +99,8 @@ static void warrior_process_packet(struct warrior *warrior, struct pt_regs *regs * packet processing routine. */ -static void warrior_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t warrior_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct warrior* warrior = serio->private; @@ -117,6 +118,7 @@ static void warrior_interrupt(struct serio *serio, unsigned char data, unsigned warrior->idx = 0; warrior->len = 0; } + return IRQ_HANDLED; } /* diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index d6a18ba074a2..7d37de446909 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c @@ -132,7 +132,8 @@ struct atkbd { * the keyboard into events. */ -static void atkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, + unsigned int flags, struct pt_regs *regs) { struct atkbd *atkbd = serio->private; int code = data; @@ -145,7 +146,7 @@ static void atkbd_interrupt(struct serio *serio, unsigned char data, unsigned in printk("atkbd.c: frame/parity error: %02x\n", flags); serio_write(serio, ATKBD_CMD_RESEND); atkbd->resend = 1; - return; + goto out; } if (!flags) @@ -154,34 +155,35 @@ static void atkbd_interrupt(struct serio *serio, unsigned char data, unsigned in switch (code) { case ATKBD_RET_ACK: atkbd->ack = 1; - return; + goto out; case ATKBD_RET_NAK: atkbd->ack = -1; - return; + goto out; } if (atkbd->cmdcnt) { atkbd->cmdbuf[--atkbd->cmdcnt] = code; - return; + goto out; } switch (atkbd->keycode[code]) { case ATKBD_KEY_BAT: serio_rescan(atkbd->serio); - return; + goto out; case ATKBD_KEY_EMUL0: atkbd->emul = 1; - return; + goto out; case ATKBD_KEY_EMUL1: atkbd->emul = 2; - return; + goto out; case ATKBD_KEY_RELEASE: atkbd->release = 1; - return; + goto out; } if (atkbd->emul) { - if (--atkbd->emul) return; + if (--atkbd->emul) + goto out; code |= 0x100; } @@ -197,8 +199,10 @@ static void atkbd_interrupt(struct serio *serio, unsigned char data, unsigned in input_report_key(&atkbd->dev, atkbd->keycode[code], !atkbd->release); input_sync(&atkbd->dev); } - + atkbd->release = 0; +out: + return IRQ_HANDLED; } /* diff --git a/drivers/input/keyboard/newtonkbd.c b/drivers/input/keyboard/newtonkbd.c index 2bc431a1b635..ce678198b9fb 100644 --- a/drivers/input/keyboard/newtonkbd.c +++ b/drivers/input/keyboard/newtonkbd.c @@ -62,7 +62,8 @@ struct nkbd { char phys[32]; }; -void nkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +irqreturn_t nkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct nkbd *nkbd = serio->private; @@ -75,6 +76,7 @@ void nkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, else if (data == 0xe7) /* end of init sequence */ printk(KERN_INFO "input: %s on %s\n", nkbd_name, serio->phys); + return IRQ_HANDLED; } diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c index e0fd1bc4c4f7..735fc752f179 100644 --- a/drivers/input/keyboard/sunkbd.c +++ b/drivers/input/keyboard/sunkbd.c @@ -89,18 +89,19 @@ struct sunkbd { * is received. */ -static void sunkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t sunkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct sunkbd* sunkbd = serio->private; if (sunkbd->reset <= -1) { /* If cp[i] is 0xff, sunkbd->reset will stay -1. */ sunkbd->reset = data; /* The keyboard sends 0xff 0xff 0xID on powerup */ - return; + goto out; } if (sunkbd->layout == -1) { sunkbd->layout = data; - return; + goto out; } switch (data) { @@ -108,14 +109,14 @@ static void sunkbd_interrupt(struct serio *serio, unsigned char data, unsigned i case SUNKBD_RET_RESET: schedule_work(&sunkbd->tq); sunkbd->reset = -1; - return; + break; case SUNKBD_RET_LAYOUT: sunkbd->layout = -1; - return; + break; case SUNKBD_RET_ALLUP: /* All keys released */ - return; + break; default: if (sunkbd->keycode[data & SUNKBD_KEY]) { @@ -127,6 +128,8 @@ static void sunkbd_interrupt(struct serio *serio, unsigned char data, unsigned i data & SUNKBD_KEY, data & SUNKBD_RELEASE ? "released" : "pressed"); } } +out: + return IRQ_HANDLED; } /* diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c index 8fb1051aa013..78847c60fe23 100644 --- a/drivers/input/keyboard/xtkbd.c +++ b/drivers/input/keyboard/xtkbd.c @@ -63,14 +63,15 @@ struct xtkbd { char phys[32]; }; -void xtkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +irqreturn_t xtkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct xtkbd *xtkbd = serio->private; switch (data) { case XTKBD_EMUL0: case XTKBD_EMUL1: - return; + break; default: if (xtkbd->keycode[data & XTKBD_KEY]) { @@ -81,7 +82,8 @@ void xtkbd_interrupt(struct serio *serio, unsigned char data, unsigned int flags printk(KERN_WARNING "xtkbd.c: Unknown key (scancode %#x) %s.\n", data & XTKBD_KEY, data & XTKBD_RELEASE ? "released" : "pressed"); } - } + } + return IRQ_HANDLED; } void xtkbd_connect(struct serio *serio, struct serio_dev *dev) diff --git a/drivers/input/mouse/inport.c b/drivers/input/mouse/inport.c index 64fa5a6f38f7..8b79f2047e3e 100644 --- a/drivers/input/mouse/inport.c +++ b/drivers/input/mouse/inport.c @@ -85,7 +85,7 @@ MODULE_PARM(inport_irq, "i"); static int inport_irq = INPORT_IRQ; static int inport_used = 0; -static void inport_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int inport_open(struct input_dev *dev) { @@ -124,7 +124,7 @@ static struct input_dev inport_dev = { }, }; -static void inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) { unsigned char buttons; @@ -150,6 +150,7 @@ static void inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); input_sync(&inport_dev); + return IRQ_HANDLED; } #ifndef MODULE diff --git a/drivers/input/mouse/logibm.c b/drivers/input/mouse/logibm.c index 0f7b9a8248b6..afe3d701ef97 100644 --- a/drivers/input/mouse/logibm.c +++ b/drivers/input/mouse/logibm.c @@ -75,7 +75,7 @@ MODULE_PARM(logibm_irq, "i"); static int logibm_irq = LOGIBM_IRQ; static int logibm_used = 0; -static void logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs); +static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs); static int logibm_open(struct input_dev *dev) { @@ -114,7 +114,7 @@ static struct input_dev logibm_dev = { }, }; -static void logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) +static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) { char dx, dy; unsigned char buttons; @@ -139,6 +139,7 @@ static void logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) input_sync(&logibm_dev); outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); + return IRQ_HANDLED; } #ifndef MODULE diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c index 2f2acbab6252..f9a3d9eebff2 100644 --- a/drivers/input/mouse/pc110pad.c +++ b/drivers/input/mouse/pc110pad.c @@ -60,7 +60,7 @@ static int pc110pad_used; static char *pc110pad_name = "IBM PC110 TouchPad"; static char *pc110pad_phys = "isa15e0/input0"; -static void pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) +static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) { int value = inb_p(pc110pad_io); int handshake = inb_p(pc110pad_io + 2); @@ -83,6 +83,7 @@ static void pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) input_sync(&pc110pad_dev); pc110pad_count = 0; + return IRQ_HANDLED; } static void pc110pad_close(struct input_dev *dev) diff --git a/drivers/input/mouse/psmouse.c b/drivers/input/mouse/psmouse.c index 7dce16948429..432bbcacedf1 100644 --- a/drivers/input/mouse/psmouse.c +++ b/drivers/input/mouse/psmouse.c @@ -167,7 +167,8 @@ static void psmouse_process_packet(struct psmouse *psmouse, struct pt_regs *regs * packets or passing them to the command routine as command output. */ -static void psmouse_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t psmouse_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct psmouse *psmouse = serio->private; @@ -186,12 +187,12 @@ static void psmouse_interrupt(struct serio *serio, unsigned char data, unsigned break; } psmouse->acking = 0; - return; + goto out; } if (psmouse->cmdcnt) { psmouse->cmdbuf[--psmouse->cmdcnt] = data; - return; + goto out; } if (psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) { @@ -205,13 +206,15 @@ static void psmouse_interrupt(struct serio *serio, unsigned char data, unsigned if (psmouse->pktcnt == 3 + (psmouse->type >= PSMOUSE_GENPS)) { psmouse_process_packet(psmouse, regs); psmouse->pktcnt = 0; - return; + goto out; } if (psmouse->pktcnt == 1 && psmouse->packet[0] == PSMOUSE_RET_BAT) { serio_rescan(serio); - return; - } + goto out; + } +out: + return IRQ_HANDLED; } /* diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c index eb1af3e998eb..9c97a0a40c4d 100644 --- a/drivers/input/mouse/sermouse.c +++ b/drivers/input/mouse/sermouse.c @@ -204,7 +204,8 @@ static void sermouse_process_ms(struct sermouse *sermouse, signed char data, str * packets or passing them to the command routine as command output. */ -static void sermouse_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t sermouse_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct sermouse *sermouse = serio->private; @@ -215,6 +216,7 @@ static void sermouse_interrupt(struct serio *serio, unsigned char data, unsigned sermouse_process_ms(sermouse, data, regs); else sermouse_process_msc(sermouse, data, regs); + return IRQ_HANDLED; } /* diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c index a3cf7bf52374..b7fc99e5b28c 100644 --- a/drivers/input/serio/ct82c710.c +++ b/drivers/input/serio/ct82c710.c @@ -64,7 +64,7 @@ static char ct82c710_phys[16]; static int ct82c710_data; static int ct82c710_status; -static void ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs); +static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs); /* * Wait for device to send output char and flush any input char. @@ -154,9 +154,9 @@ static struct serio ct82c710_port = * is waiting in the 82C710. */ -static void ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs) +static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id, struct pt_regs * regs) { - serio_interrupt(&ct82c710_port, inb(ct82c710_data), 0, regs); + return serio_interrupt(&ct82c710_port, inb(ct82c710_data), 0, regs); } /* diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index f0d7c60c6aa7..4320ed345ca5 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c @@ -135,13 +135,20 @@ void serio_rescan(struct serio *serio) wake_up(&serio_wait); } -void serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) -{ - if (serio->dev && serio->dev->interrupt) - serio->dev->interrupt(serio, data, flags, regs); - else - if (!flags) +irqreturn_t serio_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) +{ + irqreturn_t ret = IRQ_NONE; + + if (serio->dev && serio->dev->interrupt) { + ret = serio->dev->interrupt(serio, data, flags, regs); + } else { + if (!flags) { serio_rescan(serio); + ret = IRQ_HANDLED; + } + } + return ret; } void serio_register_port(struct serio *serio) diff --git a/drivers/input/touchscreen/gunze.c b/drivers/input/touchscreen/gunze.c index ae70b387b191..9aec2e1d1a6a 100644 --- a/drivers/input/touchscreen/gunze.c +++ b/drivers/input/touchscreen/gunze.c @@ -78,7 +78,8 @@ static void gunze_process_packet(struct gunze* gunze, struct pt_regs *regs) input_sync(dev); } -static void gunze_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs) +static irqreturn_t gunze_interrupt(struct serio *serio, + unsigned char data, unsigned int flags, struct pt_regs *regs) { struct gunze* gunze = serio->private; @@ -88,7 +89,8 @@ static void gunze_interrupt(struct serio *serio, unsigned char data, unsigned in } else { if (gunze->idx < GUNZE_MAX_LENGTH) gunze->data[gunze->idx++] = data; - } + } + return IRQ_HANDLED; } /* diff --git a/include/linux/serio.h b/include/linux/serio.h index 2e6d5a572ebc..ae1a7f9bde2b 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -10,6 +10,7 @@ */ #include +#include #define SPIOCSTYPE _IOW('q', 0x01, unsigned long) @@ -50,7 +51,8 @@ struct serio_dev { char *name; void (*write_wakeup)(struct serio *); - void (*interrupt)(struct serio *, unsigned char, unsigned int, struct pt_regs *); + irqreturn_t (*interrupt)(struct serio *, unsigned char, + unsigned int, struct pt_regs *); void (*connect)(struct serio *, struct serio_dev *dev); void (*disconnect)(struct serio *); void (*cleanup)(struct serio *); @@ -61,7 +63,7 @@ struct serio_dev { int serio_open(struct serio *serio, struct serio_dev *dev); void serio_close(struct serio *serio); void serio_rescan(struct serio *serio); -void serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs); +irqreturn_t serio_interrupt(struct serio *serio, unsigned char data, unsigned int flags, struct pt_regs *regs); void serio_register_port(struct serio *serio); void serio_unregister_port(struct serio *serio); -- cgit v1.2.3