#include <asm/hardware/sa1111.h>
struct ps2if {
- struct serio io;
+ struct serio *io;
struct sa1111_dev *dev;
unsigned long base;
unsigned int open;
if (hweight8(scancode) & 1)
flag ^= SERIO_PARITY;
- serio_interrupt(&ps2if->io, scancode, flag, regs);
+ serio_interrupt(ps2if->io, scancode, flag, regs);
status = sa1111_readl(ps2if->base + SA1111_PS2STAT);
}
*/
static int ps2_write(struct serio *io, unsigned char val)
{
- struct ps2if *ps2if = io->driver;
+ struct ps2if *ps2if = io->port_data;
unsigned long flags;
unsigned int head;
static int ps2_open(struct serio *io)
{
- struct ps2if *ps2if = io->driver;
+ struct ps2if *ps2if = io->port_data;
int ret;
sa1111_enable_device(ps2if->dev);
static void ps2_close(struct serio *io)
{
- struct ps2if *ps2if = io->driver;
+ struct ps2if *ps2if = io->port_data;
sa1111_writel(0, ps2if->base + SA1111_PS2CR);
static int ps2_probe(struct sa1111_dev *dev)
{
struct ps2if *ps2if;
+ struct serio *serio;
int ret;
ps2if = kmalloc(sizeof(struct ps2if), GFP_KERNEL);
- if (!ps2if) {
- return -ENOMEM;
+ serio = kmalloc(sizeof(struct serio), GFP_KERNEL);
+ if (!ps2if || !serio) {
+ ret = -ENOMEM;
+ goto free;
}
memset(ps2if, 0, sizeof(struct ps2if));
-
- ps2if->io.type = SERIO_8042;
- ps2if->io.write = ps2_write;
- ps2if->io.open = ps2_open;
- ps2if->io.close = ps2_close;
- ps2if->io.name = dev->dev.bus_id;
- ps2if->io.phys = dev->dev.bus_id;
- ps2if->io.driver = ps2if;
+ memset(serio, 0, sizeof(struct serio));
+
+ serio->type = SERIO_8042;
+ serio->write = ps2_write;
+ serio->open = ps2_open;
+ serio->close = ps2_close;
+ strlcpy(serio->name, dev->dev.bus_id, 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;
sa1111_set_drvdata(dev, ps2if);
ps2_clear_input(ps2if);
sa1111_disable_device(ps2if->dev);
- serio_register_port(&ps2if->io);
+ serio_register_port(ps2if->io);
return 0;
out:
free:
sa1111_set_drvdata(dev, NULL);
kfree(ps2if);
+ kfree(serio);
return ret;
}
{
struct ps2if *ps2if = sa1111_get_drvdata(dev);
- serio_unregister_port(&ps2if->io);
+ serio_unregister_port(ps2if->io);
release_mem_region(dev->res.start,
dev->res.end - dev->res.start + 1);
sa1111_set_drvdata(dev, NULL);