2 * SEGA Dreamcast mouse driver
3 * Based on drivers/usb/usbmouse.c
5 * Copyright (c) Yaegashi Takeshi, 2001
6 * Copyright (c) Adrian McMenamin, 2008 - 2009
9 #include <linux/kernel.h>
10 #include <linux/slab.h>
11 #include <linux/input.h>
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/timer.h>
15 #include <linux/maple.h>
17 MODULE_AUTHOR("Adrian McMenamin <adrian@mcmen.demon.co.uk>");
18 MODULE_DESCRIPTION("SEGA Dreamcast mouse driver");
19 MODULE_LICENSE("GPL");
22 struct input_dev
*dev
;
23 struct maple_device
*mdev
;
26 static void dc_mouse_callback(struct mapleq
*mq
)
28 int buttons
, relx
, rely
, relz
;
29 struct maple_device
*mapledev
= mq
->dev
;
30 struct dc_mouse
*mse
= maple_get_drvdata(mapledev
);
31 struct input_dev
*dev
= mse
->dev
;
32 unsigned char *res
= mq
->recvbuf
->buf
;
35 relx
= *(unsigned short *)(res
+ 12) - 512;
36 rely
= *(unsigned short *)(res
+ 14) - 512;
37 relz
= *(unsigned short *)(res
+ 16) - 512;
39 input_report_key(dev
, BTN_LEFT
, buttons
& 4);
40 input_report_key(dev
, BTN_MIDDLE
, buttons
& 9);
41 input_report_key(dev
, BTN_RIGHT
, buttons
& 2);
42 input_report_rel(dev
, REL_X
, relx
);
43 input_report_rel(dev
, REL_Y
, rely
);
44 input_report_rel(dev
, REL_WHEEL
, relz
);
48 static int dc_mouse_open(struct input_dev
*dev
)
50 struct dc_mouse
*mse
= maple_get_drvdata(to_maple_dev(&dev
->dev
));
52 maple_getcond_callback(mse
->mdev
, dc_mouse_callback
, HZ
/50,
58 static void dc_mouse_close(struct input_dev
*dev
)
60 struct dc_mouse
*mse
= maple_get_drvdata(to_maple_dev(&dev
->dev
));
62 maple_getcond_callback(mse
->mdev
, dc_mouse_callback
, 0,
66 /* allow the mouse to be used */
67 static int probe_maple_mouse(struct device
*dev
)
69 struct maple_device
*mdev
= to_maple_dev(dev
);
70 struct maple_driver
*mdrv
= to_maple_driver(dev
->driver
);
72 struct input_dev
*input_dev
;
75 mse
= kzalloc(sizeof(struct dc_mouse
), GFP_KERNEL
);
81 input_dev
= input_allocate_device();
90 input_dev
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_REL
);
91 input_dev
->keybit
[BIT_WORD(BTN_MOUSE
)] = BIT_MASK(BTN_LEFT
) |
92 BIT_MASK(BTN_RIGHT
) | BIT_MASK(BTN_MIDDLE
);
93 input_dev
->relbit
[0] = BIT_MASK(REL_X
) | BIT_MASK(REL_Y
) |
95 input_dev
->open
= dc_mouse_open
;
96 input_dev
->close
= dc_mouse_close
;
97 input_dev
->name
= mdev
->product_name
;
98 input_dev
->id
.bustype
= BUS_HOST
;
99 error
= input_register_device(input_dev
);
104 maple_set_drvdata(mdev
, mse
);
109 input_free_device(input_dev
);
116 static int remove_maple_mouse(struct device
*dev
)
118 struct maple_device
*mdev
= to_maple_dev(dev
);
119 struct dc_mouse
*mse
= maple_get_drvdata(mdev
);
121 mdev
->callback
= NULL
;
122 input_unregister_device(mse
->dev
);
123 maple_set_drvdata(mdev
, NULL
);
129 static struct maple_driver dc_mouse_driver
= {
130 .function
= MAPLE_FUNC_MOUSE
,
132 .name
= "Dreamcast_mouse",
133 .probe
= probe_maple_mouse
,
134 .remove
= remove_maple_mouse
,
138 static int __init
dc_mouse_init(void)
140 return maple_driver_register(&dc_mouse_driver
);
143 static void __exit
dc_mouse_exit(void)
145 maple_driver_unregister(&dc_mouse_driver
);
148 module_init(dc_mouse_init
);
149 module_exit(dc_mouse_exit
);