vserver 1.9.3
[linux-2.6.git] / drivers / input / serio / pcips2.c
index 2b4acac..489749e 100644 (file)
 #define PS2_STAT_TXEMPTY       (1<<7)
 
 struct pcips2_data {
-       struct serio    io;
+       struct serio    *io;
        unsigned int    base;
        struct pci_dev  *dev;
 };
 
 static int pcips2_write(struct serio *io, unsigned char val)
 {
-       struct pcips2_data *ps2if = io->driver;
+       struct pcips2_data *ps2if = io->port_data;
        unsigned int stat;
 
        do {
@@ -80,7 +80,7 @@ static irqreturn_t pcips2_interrupt(int irq, void *devid, struct pt_regs *regs)
                if (hweight8(scancode) & 1)
                        flag ^= SERIO_PARITY;
 
-               serio_interrupt(&ps2if->io, scancode, flag, regs);
+               serio_interrupt(ps2if->io, scancode, flag, regs);
        } while (1);
        return IRQ_RETVAL(handled);
 }
@@ -101,7 +101,7 @@ static void pcips2_flush_input(struct pcips2_data *ps2if)
 
 static int pcips2_open(struct serio *io)
 {
-       struct pcips2_data *ps2if = io->driver;
+       struct pcips2_data *ps2if = io->port_data;
        int ret, val = 0;
 
        outb(PS2_CTRL_ENABLE, ps2if->base);
@@ -119,7 +119,7 @@ static int pcips2_open(struct serio *io)
 
 static void pcips2_close(struct serio *io)
 {
-       struct pcips2_data *ps2if = io->driver;
+       struct pcips2_data *ps2if = io->port_data;
 
        outb(0, ps2if->base);
 
@@ -129,46 +129,51 @@ static void pcips2_close(struct serio *io)
 static int __devinit pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        struct pcips2_data *ps2if;
+       struct serio *serio;
        int ret;
 
        ret = pci_enable_device(dev);
        if (ret)
-               return ret;
+               goto out;
 
-       if (!request_region(pci_resource_start(dev, 0),
-                           pci_resource_len(dev, 0), "pcips2")) {
-               ret = -EBUSY;
+       ret = pci_request_regions(dev, "pcips2");
+       if (ret)
                goto disable;
-       }
 
        ps2if = kmalloc(sizeof(struct pcips2_data), GFP_KERNEL);
-       if (!ps2if) {
+       serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
+       if (!ps2if || !serio) {
                ret = -ENOMEM;
                goto release;
        }
 
        memset(ps2if, 0, sizeof(struct pcips2_data));
-
-       ps2if->io.type          = SERIO_8042;
-       ps2if->io.write         = pcips2_write;
-       ps2if->io.open          = pcips2_open;
-       ps2if->io.close         = pcips2_close;
-       ps2if->io.name          = pci_name(dev);
-       ps2if->io.phys          = dev->dev.bus_id;
-       ps2if->io.driver        = ps2if;
+       memset(serio, 0, sizeof(struct serio));
+
+       serio->type             = SERIO_8042;
+       serio->write            = pcips2_write;
+       serio->open             = pcips2_open;
+       serio->close            = pcips2_close;
+       strlcpy(serio->name, pci_name(dev), sizeof(serio->name));
+       strlcpy(serio->phys, dev->dev.bus_id, sizeof(serio->phys));
+       serio->port_data        = ps2if;
+       serio->dev.parent       = &dev->dev;
+       ps2if->io               = serio;
        ps2if->dev              = dev;
        ps2if->base             = pci_resource_start(dev, 0);
 
        pci_set_drvdata(dev, ps2if);
 
-       serio_register_port(&ps2if->io);
+       serio_register_port(ps2if->io);
        return 0;
 
  release:
-       release_region(pci_resource_start(dev, 0),
-                      pci_resource_len(dev, 0));
+       kfree(ps2if);
+       kfree(serio);
+       pci_release_regions(dev);
  disable:
        pci_disable_device(dev);
+ out:
        return ret;
 }
 
@@ -176,11 +181,10 @@ static void __devexit pcips2_remove(struct pci_dev *dev)
 {
        struct pcips2_data *ps2if = pci_get_drvdata(dev);
 
-       serio_unregister_port(&ps2if->io);
-       release_region(pci_resource_start(dev, 0),
-                      pci_resource_len(dev, 0));
+       serio_unregister_port(ps2if->io);
        pci_set_drvdata(dev, NULL);
        kfree(ps2if);
+       pci_release_regions(dev);
        pci_disable_device(dev);
 }