From 4d74063ef7399f13e5f940260d564731ceec5ee5 Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Sun, 20 Apr 2003 20:21:28 -0700 Subject: [PATCH] [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(-) diff --git a/drivers/input/joystick/iforce/iforce-serio.c b/drivers/input/joystick/iforce/iforce-serio.c index 7037ded745771..e17c2e8a5aa00 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 203f13b4be14a..992511d830e53 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 c2ecf93cc3962..4e288b58c9b2d 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 3c59a6316d70c..593dcac965195 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 3f47b345aa4bd..f68d3add23000 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 7509892f24308..426ce2d5e5cf5 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 d6a18ba074a2f..7d37de446909b 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 2bc431a1b6353..ce678198b9fb0 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 e0fd1bc4c4f7f..735fc752f1797 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 8fb1051aa0137..78847c60fe23a 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 64fa5a6f38f79..8b79f2047e3e7 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 0f7b9a8248b62..afe3d701ef97d 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 2f2acbab62520..f9a3d9eebff2e 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 7dce16948429e..432bbcacedf1d 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 eb1af3e998eb3..9c97a0a40c4d5 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 a3cf7bf523744..b7fc99e5b28c5 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 f0d7c60c6aa7a..4320ed345ca50 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 ae70b387b1915..9aec2e1d1a6a3 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 2e6d5a572ebc3..ae1a7f9bde2b4 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); -- 2.53.0