fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / input / serio / gscps2.c
index cd9f987..74f14e0 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * drivers/input/serio/gscps2.c
  *
- * Copyright (c) 2004 Helge Deller <deller@gmx.de>
+ * Copyright (c) 2004-2006 Helge Deller <deller@gmx.de>
  * Copyright (c) 2002 Laurent Canet <canetl@esiee.fr>
- * Copyright (c) 2002 Thibaut Varene <varenet@esiee.fr>
+ * Copyright (c) 2002 Thibaut Varene <varenet@parisc-linux.org>
  *
  * Pieces of code based on linux-2.4's hp_mouse.c & hp_keyb.c
  *     Copyright (c) 1999 Alex deVries <alex@onefishtwo.ca>
@@ -22,7 +22,6 @@
  *                 was usable/enabled ?)
  */
 
-#include <linux/config.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/serio.h>
@@ -37,8 +36,8 @@
 #include <asm/io.h>
 #include <asm/parisc-device.h>
 
-MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@esiee.fr>, Helge Deller <deller@gmx.de>");
-MODULE_DESCRIPTION("HP GSC PS/2 port driver");
+MODULE_AUTHOR("Laurent Canet <canetl@esiee.fr>, Thibaut Varene <varenet@parisc-linux.org>, Helge Deller <deller@gmx.de>");
+MODULE_DESCRIPTION("HP GSC PS2 port driver");
 MODULE_LICENSE("GPL");
 MODULE_DEVICE_TABLE(parisc, gscps2_device_tbl);
 
@@ -83,7 +82,7 @@ MODULE_DEVICE_TABLE(parisc, gscps2_device_tbl);
 #define GSC_ID_MOUSE           1
 
 
-static irqreturn_t gscps2_interrupt(int irq, void *dev, struct pt_regs *regs);
+static irqreturn_t gscps2_interrupt(int irq, void *dev);
 
 #define BUFFER_SIZE 0x0f
 
@@ -167,7 +166,7 @@ static inline int gscps2_writeb_output(struct gscps2port *ps2port, u8 data)
 
        /* make sure any received data is returned as fast as possible */
        /* this is important e.g. when we set the LEDs on the keyboard */
-       gscps2_interrupt(0, NULL, NULL);
+       gscps2_interrupt(0, NULL);
 
        return 1;
 }
@@ -211,9 +210,6 @@ static void gscps2_reset(struct gscps2port *ps2port)
        writeb(0xff, addr+GSC_RESET);
        gscps2_flush(ps2port);
        spin_unlock_irqrestore(&ps2port->lock, flags);
-
-       /* enable it */
-       gscps2_enable(ps2port, ENABLE);
 }
 
 static LIST_HEAD(ps2port_list);
@@ -230,7 +226,7 @@ static LIST_HEAD(ps2port_list);
  * later.
  */
 
-static irqreturn_t gscps2_interrupt(int irq, void *dev, struct pt_regs *regs)
+static irqreturn_t gscps2_interrupt(int irq, void *dev)
 {
        struct gscps2port *ps2port;
 
@@ -271,7 +267,7 @@ static irqreturn_t gscps2_interrupt(int irq, void *dev, struct pt_regs *regs)
            rxflags =   ((status & GSC_STAT_TERR) ? SERIO_TIMEOUT : 0 ) |
                        ((status & GSC_STAT_PERR) ? SERIO_PARITY  : 0 );
 
-           serio_interrupt(ps2port->port, data, rxflags, regs);
+           serio_interrupt(ps2port->port, data, rxflags);
 
          } /* while() */
 
@@ -307,7 +303,10 @@ static int gscps2_open(struct serio *port)
 
        gscps2_reset(ps2port);
 
-       gscps2_interrupt(0, NULL, NULL);
+       /* enable it */
+       gscps2_enable(ps2port, ENABLE);
+
+       gscps2_interrupt(0, NULL);
 
        return 0;
 }
@@ -322,19 +321,6 @@ static void gscps2_close(struct serio *port)
        gscps2_enable(ps2port, DISABLE);
 }
 
-static struct serio gscps2_serio_port =
-{
-       .name =         "GSC PS/2",
-       .idbus =        BUS_GSC,
-       .idvendor =     PCI_VENDOR_ID_HP,
-       .idproduct =    0x0001,
-       .idversion =    0x0010,
-       .type =         SERIO_8042,
-       .write =        gscps2_write,
-       .open =         gscps2_open,
-       .close =        gscps2_close,
-};
-
 /**
  * gscps2_probe() - Probes PS2 devices
  * @return: success/error report
@@ -344,7 +330,7 @@ static int __init gscps2_probe(struct parisc_device *dev)
 {
        struct gscps2port *ps2port;
        struct serio *serio;
-       unsigned long hpa = dev->hpa;
+       unsigned long hpa = dev->hpa.start;
        int ret;
 
        if (!dev->irq)
@@ -367,7 +353,7 @@ static int __init gscps2_probe(struct parisc_device *dev)
        memset(serio, 0, sizeof(struct serio));
        ps2port->port = serio;
        ps2port->padev = dev;
-       ps2port->addr = ioremap(hpa, GSC_STATUS + 4);
+       ps2port->addr = ioremap_nocache(hpa, GSC_STATUS + 4);
        spin_lock_init(&ps2port->lock);
 
        gscps2_reset(ps2port);
@@ -376,21 +362,15 @@ static int __init gscps2_probe(struct parisc_device *dev)
        snprintf(serio->name, sizeof(serio->name), "GSC PS/2 %s",
                 (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse");
        strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
-       serio->idbus            = BUS_GSC;
-       serio->idvendor         = PCI_VENDOR_ID_HP;
-       serio->idproduct        = 0x0001;
-       serio->idversion        = 0x0010;
-       serio->type             = SERIO_8042;
+       serio->id.type          = SERIO_8042;
        serio->write            = gscps2_write;
        serio->open             = gscps2_open;
        serio->close            = gscps2_close;
        serio->port_data        = ps2port;
        serio->dev.parent       = &dev->dev;
 
-       list_add_tail(&ps2port->node, &ps2port_list);
-
        ret = -EBUSY;
-       if (request_irq(dev->irq, gscps2_interrupt, SA_SHIRQ, ps2port->port->name, ps2port))
+       if (request_irq(dev->irq, gscps2_interrupt, IRQF_SHARED, ps2port->port->name, ps2port))
                goto fail_miserably;
 
        if (ps2port->id != GSC_ID_KEYBOARD && ps2port->id != GSC_ID_MOUSE) {
@@ -413,15 +393,16 @@ static int __init gscps2_probe(struct parisc_device *dev)
 
        serio_register_port(ps2port->port);
 
+       list_add_tail(&ps2port->node, &ps2port_list);
+
        return 0;
 
 fail:
        free_irq(dev->irq, ps2port);
 
 fail_miserably:
-       list_del(&ps2port->node);
        iounmap(ps2port->addr);
-       release_mem_region(dev->hpa, GSC_STATUS + 4);
+       release_mem_region(dev->hpa.start, GSC_STATUS + 4);
 
 fail_nomem:
        kfree(ps2port);
@@ -461,7 +442,7 @@ static struct parisc_device_id gscps2_device_tbl[] = {
 };
 
 static struct parisc_driver parisc_ps2_driver = {
-       .name           = "GSC PS/2",
+       .name           = "gsc_ps2",
        .id_table       = gscps2_device_tbl,
        .probe          = gscps2_probe,
        .remove         = gscps2_remove,