diff options
Diffstat (limited to 'drivers/input/mouse/maplemouse.c')
| -rw-r--r-- | drivers/input/mouse/maplemouse.c | 135 |
1 files changed, 90 insertions, 45 deletions
diff --git a/drivers/input/mouse/maplemouse.c b/drivers/input/mouse/maplemouse.c index e90c60cbbf0..0a60717b91c 100644 --- a/drivers/input/mouse/maplemouse.c +++ b/drivers/input/mouse/maplemouse.c @@ -1,7 +1,9 @@ /* - * $Id: maplemouse.c,v 1.2 2004/03/22 01:18:15 lethal Exp $ * SEGA Dreamcast mouse driver * Based on drivers/usb/usbmouse.c + * + * Copyright (c) Yaegashi Takeshi, 2001 + * Copyright (c) Adrian McMenamin, 2008 - 2009 */ #include <linux/kernel.h> @@ -12,15 +14,22 @@ #include <linux/timer.h> #include <linux/maple.h> -MODULE_AUTHOR("YAEGASHI Takeshi <t@keshi.org>"); +MODULE_AUTHOR("Adrian McMenamin <adrian@mcmen.demon.co.uk>"); MODULE_DESCRIPTION("SEGA Dreamcast mouse driver"); +MODULE_LICENSE("GPL"); + +struct dc_mouse { + struct input_dev *dev; + struct maple_device *mdev; +}; static void dc_mouse_callback(struct mapleq *mq) { int buttons, relx, rely, relz; struct maple_device *mapledev = mq->dev; - struct input_dev *dev = mapledev->private_data; - unsigned char *res = mq->recvbuf; + struct dc_mouse *mse = maple_get_drvdata(mapledev); + struct input_dev *dev = mse->dev; + unsigned char *res = mq->recvbuf->buf; buttons = ~res[8]; relx = *(unsigned short *)(res + 12) - 512; @@ -36,70 +45,106 @@ static void dc_mouse_callback(struct mapleq *mq) input_sync(dev); } -static int dc_mouse_connect(struct maple_device *dev) +static int dc_mouse_open(struct input_dev *dev) { - unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]); - struct input_dev *input_dev; - - if (!(input_dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL))) - return -1; - - dev->private_data = input_dev; - - memset(input_dev, 0, sizeof(struct dc_mouse)); - init_input_dev(input_dev); - input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); - input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); - input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL); + struct dc_mouse *mse = maple_get_drvdata(to_maple_dev(&dev->dev)); - input_dev->name = dev->product_name; - input_dev->id.bustype = BUS_MAPLE; + maple_getcond_callback(mse->mdev, dc_mouse_callback, HZ/50, + MAPLE_FUNC_MOUSE); - input_register_device(input_dev); - - maple_getcond_callback(dev, dc_mouse_callback, 1, MAPLE_FUNC_MOUSE); + return 0; +} - printk(KERN_INFO "input: mouse(0x%lx): %s\n", data, input_dev->name); +static void dc_mouse_close(struct input_dev *dev) +{ + struct dc_mouse *mse = maple_get_drvdata(to_maple_dev(&dev->dev)); - return 0; + maple_getcond_callback(mse->mdev, dc_mouse_callback, 0, + MAPLE_FUNC_MOUSE); } +/* allow the mouse to be used */ +static int probe_maple_mouse(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct maple_driver *mdrv = to_maple_driver(dev->driver); + int error; + struct input_dev *input_dev; + struct dc_mouse *mse; + + mse = kzalloc(sizeof(struct dc_mouse), GFP_KERNEL); + if (!mse) { + error = -ENOMEM; + goto fail; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + error = -ENOMEM; + goto fail_nomem; + } + + mse->dev = input_dev; + mse->mdev = mdev; + + input_set_drvdata(input_dev, mse); + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); + input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y) | + BIT_MASK(REL_WHEEL); + input_dev->open = dc_mouse_open; + input_dev->close = dc_mouse_close; + input_dev->name = mdev->product_name; + input_dev->id.bustype = BUS_HOST; + error = input_register_device(input_dev); + if (error) + goto fail_register; + + mdev->driver = mdrv; + maple_set_drvdata(mdev, mse); + + return error; + +fail_register: + input_free_device(input_dev); +fail_nomem: + kfree(mse); +fail: + return error; +} -static void dc_mouse_disconnect(struct maple_device *dev) +static int remove_maple_mouse(struct device *dev) { - struct input_dev *input_dev = dev->private_data; + struct maple_device *mdev = to_maple_dev(dev); + struct dc_mouse *mse = maple_get_drvdata(mdev); - input_unregister_device(input_dev); - kfree(input_dev); -} + mdev->callback = NULL; + input_unregister_device(mse->dev); + maple_set_drvdata(mdev, NULL); + kfree(mse); + return 0; +} static struct maple_driver dc_mouse_driver = { .function = MAPLE_FUNC_MOUSE, - .name = "Dreamcast mouse", - .connect = dc_mouse_connect, - .disconnect = dc_mouse_disconnect, + .drv = { + .name = "Dreamcast_mouse", + .probe = probe_maple_mouse, + .remove = remove_maple_mouse, + }, }; - static int __init dc_mouse_init(void) { - maple_register_driver(&dc_mouse_driver); - return 0; + return maple_driver_register(&dc_mouse_driver); } - static void __exit dc_mouse_exit(void) { - maple_unregister_driver(&dc_mouse_driver); + maple_driver_unregister(&dc_mouse_driver); } - module_init(dc_mouse_init); module_exit(dc_mouse_exit); - -/* - * Local variables: - * c-basic-offset: 8 - * End: - */ |
