#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 {
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);
}
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);
static void pcips2_close(struct serio *io)
{
- struct pcips2_data *ps2if = io->driver;
+ struct pcips2_data *ps2if = io->port_data;
outb(0, ps2if->base);
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;
}
{
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);
}