allow coexistance of N build and AC build.
[tomato.git] / release / src-rt-6.x / linux / linux-2.6 / drivers / macintosh / adbhid.c
blob6c7ed873dfb4d3e7907b6c88fa86344240907cc5
1 /*
2 * drivers/macintosh/adbhid.c
4 * ADB HID driver for Power Macintosh computers.
6 * Adapted from drivers/macintosh/mac_keyb.c by Franz Sirl.
7 * drivers/macintosh/mac_keyb.c was Copyright (C) 1996 Paul Mackerras
8 * with considerable contributions from Ben Herrenschmidt and others.
10 * Copyright (C) 2000 Franz Sirl.
12 * Adapted to ADB changes and support for more devices by
13 * Benjamin Herrenschmidt. Adapted from code in MkLinux
14 * and reworked.
16 * Supported devices:
18 * - Standard 1 button mouse
19 * - All standard Apple Extended protocol (handler ID 4)
20 * - mouseman and trackman mice & trackballs
21 * - PowerBook Trackpad (default setup: enable tapping)
22 * - MicroSpeed mouse & trackball (needs testing)
23 * - CH Products Trackball Pro (needs testing)
24 * - Contour Design (Contour Mouse)
25 * - Hunter digital (NoHandsMouse)
26 * - Kensignton TurboMouse 5 (needs testing)
27 * - Mouse Systems A3 mice and trackballs <aidan@kublai.com>
28 * - MacAlly 2-buttons mouse (needs testing) <pochini@denise.shiny.it>
30 * To do:
32 * Improve Kensington support.
33 * Split mouse/kbd
34 * Move to syfs
37 #include <linux/module.h>
38 #include <linux/slab.h>
39 #include <linux/init.h>
40 #include <linux/notifier.h>
41 #include <linux/input.h>
43 #include <linux/adb.h>
44 #include <linux/cuda.h>
45 #include <linux/pmu.h>
47 #include <asm/machdep.h>
48 #ifdef CONFIG_PPC_PMAC
49 #include <asm/backlight.h>
50 #include <asm/pmac_feature.h>
51 #endif
53 MODULE_AUTHOR("Franz Sirl <Franz.Sirl-kernel@lauterbach.com>");
55 #define KEYB_KEYREG 0 /* register # for key up/down data */
56 #define KEYB_LEDREG 2 /* register # for leds on ADB keyboard */
57 #define MOUSE_DATAREG 0 /* reg# for movement/button codes from mouse */
59 static int adb_message_handler(struct notifier_block *, unsigned long, void *);
60 static struct notifier_block adbhid_adb_notifier = {
61 .notifier_call = adb_message_handler,
64 /* Some special keys */
65 #define ADB_KEY_DEL 0x33
66 #define ADB_KEY_CMD 0x37
67 #define ADB_KEY_CAPSLOCK 0x39
68 #define ADB_KEY_FN 0x3f
69 #define ADB_KEY_FWDEL 0x75
70 #define ADB_KEY_POWER_OLD 0x7e
71 #define ADB_KEY_POWER 0x7f
73 u8 adb_to_linux_keycodes[128] = {
74 /* 0x00 */ KEY_A, /* 30 */
75 /* 0x01 */ KEY_S, /* 31 */
76 /* 0x02 */ KEY_D, /* 32 */
77 /* 0x03 */ KEY_F, /* 33 */
78 /* 0x04 */ KEY_H, /* 35 */
79 /* 0x05 */ KEY_G, /* 34 */
80 /* 0x06 */ KEY_Z, /* 44 */
81 /* 0x07 */ KEY_X, /* 45 */
82 /* 0x08 */ KEY_C, /* 46 */
83 /* 0x09 */ KEY_V, /* 47 */
84 /* 0x0a */ KEY_102ND, /* 86 */
85 /* 0x0b */ KEY_B, /* 48 */
86 /* 0x0c */ KEY_Q, /* 16 */
87 /* 0x0d */ KEY_W, /* 17 */
88 /* 0x0e */ KEY_E, /* 18 */
89 /* 0x0f */ KEY_R, /* 19 */
90 /* 0x10 */ KEY_Y, /* 21 */
91 /* 0x11 */ KEY_T, /* 20 */
92 /* 0x12 */ KEY_1, /* 2 */
93 /* 0x13 */ KEY_2, /* 3 */
94 /* 0x14 */ KEY_3, /* 4 */
95 /* 0x15 */ KEY_4, /* 5 */
96 /* 0x16 */ KEY_6, /* 7 */
97 /* 0x17 */ KEY_5, /* 6 */
98 /* 0x18 */ KEY_EQUAL, /* 13 */
99 /* 0x19 */ KEY_9, /* 10 */
100 /* 0x1a */ KEY_7, /* 8 */
101 /* 0x1b */ KEY_MINUS, /* 12 */
102 /* 0x1c */ KEY_8, /* 9 */
103 /* 0x1d */ KEY_0, /* 11 */
104 /* 0x1e */ KEY_RIGHTBRACE, /* 27 */
105 /* 0x1f */ KEY_O, /* 24 */
106 /* 0x20 */ KEY_U, /* 22 */
107 /* 0x21 */ KEY_LEFTBRACE, /* 26 */
108 /* 0x22 */ KEY_I, /* 23 */
109 /* 0x23 */ KEY_P, /* 25 */
110 /* 0x24 */ KEY_ENTER, /* 28 */
111 /* 0x25 */ KEY_L, /* 38 */
112 /* 0x26 */ KEY_J, /* 36 */
113 /* 0x27 */ KEY_APOSTROPHE, /* 40 */
114 /* 0x28 */ KEY_K, /* 37 */
115 /* 0x29 */ KEY_SEMICOLON, /* 39 */
116 /* 0x2a */ KEY_BACKSLASH, /* 43 */
117 /* 0x2b */ KEY_COMMA, /* 51 */
118 /* 0x2c */ KEY_SLASH, /* 53 */
119 /* 0x2d */ KEY_N, /* 49 */
120 /* 0x2e */ KEY_M, /* 50 */
121 /* 0x2f */ KEY_DOT, /* 52 */
122 /* 0x30 */ KEY_TAB, /* 15 */
123 /* 0x31 */ KEY_SPACE, /* 57 */
124 /* 0x32 */ KEY_GRAVE, /* 41 */
125 /* 0x33 */ KEY_BACKSPACE, /* 14 */
126 /* 0x34 */ KEY_KPENTER, /* 96 */
127 /* 0x35 */ KEY_ESC, /* 1 */
128 /* 0x36 */ KEY_LEFTCTRL, /* 29 */
129 /* 0x37 */ KEY_LEFTMETA, /* 125 */
130 /* 0x38 */ KEY_LEFTSHIFT, /* 42 */
131 /* 0x39 */ KEY_CAPSLOCK, /* 58 */
132 /* 0x3a */ KEY_LEFTALT, /* 56 */
133 /* 0x3b */ KEY_LEFT, /* 105 */
134 /* 0x3c */ KEY_RIGHT, /* 106 */
135 /* 0x3d */ KEY_DOWN, /* 108 */
136 /* 0x3e */ KEY_UP, /* 103 */
137 /* 0x3f */ 0,
138 /* 0x40 */ 0,
139 /* 0x41 */ KEY_KPDOT, /* 83 */
140 /* 0x42 */ 0,
141 /* 0x43 */ KEY_KPASTERISK, /* 55 */
142 /* 0x44 */ 0,
143 /* 0x45 */ KEY_KPPLUS, /* 78 */
144 /* 0x46 */ 0,
145 /* 0x47 */ KEY_NUMLOCK, /* 69 */
146 /* 0x48 */ 0,
147 /* 0x49 */ 0,
148 /* 0x4a */ 0,
149 /* 0x4b */ KEY_KPSLASH, /* 98 */
150 /* 0x4c */ KEY_KPENTER, /* 96 */
151 /* 0x4d */ 0,
152 /* 0x4e */ KEY_KPMINUS, /* 74 */
153 /* 0x4f */ 0,
154 /* 0x50 */ 0,
155 /* 0x51 */ KEY_KPEQUAL, /* 117 */
156 /* 0x52 */ KEY_KP0, /* 82 */
157 /* 0x53 */ KEY_KP1, /* 79 */
158 /* 0x54 */ KEY_KP2, /* 80 */
159 /* 0x55 */ KEY_KP3, /* 81 */
160 /* 0x56 */ KEY_KP4, /* 75 */
161 /* 0x57 */ KEY_KP5, /* 76 */
162 /* 0x58 */ KEY_KP6, /* 77 */
163 /* 0x59 */ KEY_KP7, /* 71 */
164 /* 0x5a */ 0,
165 /* 0x5b */ KEY_KP8, /* 72 */
166 /* 0x5c */ KEY_KP9, /* 73 */
167 /* 0x5d */ KEY_YEN, /* 124 */
168 /* 0x5e */ KEY_RO, /* 89 */
169 /* 0x5f */ KEY_KPCOMMA, /* 121 */
170 /* 0x60 */ KEY_F5, /* 63 */
171 /* 0x61 */ KEY_F6, /* 64 */
172 /* 0x62 */ KEY_F7, /* 65 */
173 /* 0x63 */ KEY_F3, /* 61 */
174 /* 0x64 */ KEY_F8, /* 66 */
175 /* 0x65 */ KEY_F9, /* 67 */
176 /* 0x66 */ KEY_HANJA, /* 123 */
177 /* 0x67 */ KEY_F11, /* 87 */
178 /* 0x68 */ KEY_HANGEUL, /* 122 */
179 /* 0x69 */ KEY_SYSRQ, /* 99 */
180 /* 0x6a */ 0,
181 /* 0x6b */ KEY_SCROLLLOCK, /* 70 */
182 /* 0x6c */ 0,
183 /* 0x6d */ KEY_F10, /* 68 */
184 /* 0x6e */ KEY_COMPOSE, /* 127 */
185 /* 0x6f */ KEY_F12, /* 88 */
186 /* 0x70 */ 0,
187 /* 0x71 */ KEY_PAUSE, /* 119 */
188 /* 0x72 */ KEY_INSERT, /* 110 */
189 /* 0x73 */ KEY_HOME, /* 102 */
190 /* 0x74 */ KEY_PAGEUP, /* 104 */
191 /* 0x75 */ KEY_DELETE, /* 111 */
192 /* 0x76 */ KEY_F4, /* 62 */
193 /* 0x77 */ KEY_END, /* 107 */
194 /* 0x78 */ KEY_F2, /* 60 */
195 /* 0x79 */ KEY_PAGEDOWN, /* 109 */
196 /* 0x7a */ KEY_F1, /* 59 */
197 /* 0x7b */ KEY_RIGHTSHIFT, /* 54 */
198 /* 0x7c */ KEY_RIGHTALT, /* 100 */
199 /* 0x7d */ KEY_RIGHTCTRL, /* 97 */
200 /* 0x7e */ KEY_RIGHTMETA, /* 126 */
201 /* 0x7f */ KEY_POWER, /* 116 */
204 struct adbhid {
205 struct input_dev *input;
206 int id;
207 int default_id;
208 int original_handler_id;
209 int current_handler_id;
210 int mouse_kind;
211 unsigned char *keycode;
212 char name[64];
213 char phys[32];
214 int flags;
217 #define FLAG_FN_KEY_PRESSED 0x00000001
218 #define FLAG_POWER_FROM_FN 0x00000002
219 #define FLAG_EMU_FWDEL_DOWN 0x00000004
221 static struct adbhid *adbhid[16];
223 static void adbhid_probe(void);
225 static void adbhid_input_keycode(int, int, int);
227 static void init_trackpad(int id);
228 static void init_trackball(int id);
229 static void init_turbomouse(int id);
230 static void init_microspeed(int id);
231 static void init_ms_a3(int id);
233 static struct adb_ids keyboard_ids;
234 static struct adb_ids mouse_ids;
235 static struct adb_ids buttons_ids;
237 /* Kind of keyboard, see Apple technote 1152 */
238 #define ADB_KEYBOARD_UNKNOWN 0
239 #define ADB_KEYBOARD_ANSI 0x0100
240 #define ADB_KEYBOARD_ISO 0x0200
241 #define ADB_KEYBOARD_JIS 0x0300
243 /* Kind of mouse */
244 #define ADBMOUSE_STANDARD_100 0 /* Standard 100cpi mouse (handler 1) */
245 #define ADBMOUSE_STANDARD_200 1 /* Standard 200cpi mouse (handler 2) */
246 #define ADBMOUSE_EXTENDED 2 /* Apple Extended mouse (handler 4) */
247 #define ADBMOUSE_TRACKBALL 3 /* TrackBall (handler 4) */
248 #define ADBMOUSE_TRACKPAD 4 /* Apple's PowerBook trackpad (handler 4) */
249 #define ADBMOUSE_TURBOMOUSE5 5 /* Turbomouse 5 (previously req. mousehack) */
250 #define ADBMOUSE_MICROSPEED 6 /* Microspeed mouse (&trackball ?), MacPoint */
251 #define ADBMOUSE_TRACKBALLPRO 7 /* Trackball Pro (special buttons) */
252 #define ADBMOUSE_MS_A3 8 /* Mouse systems A3 trackball (handler 3) */
253 #define ADBMOUSE_MACALLY2 9 /* MacAlly 2-button mouse */
255 static void
256 adbhid_keyboard_input(unsigned char *data, int nb, int apoll)
258 int id = (data[0] >> 4) & 0x0f;
260 if (!adbhid[id]) {
261 printk(KERN_ERR "ADB HID on ID %d not yet registered, packet %#02x, %#02x, %#02x, %#02x\n",
262 id, data[0], data[1], data[2], data[3]);
263 return;
266 /* first check this is from register 0 */
267 if (nb != 3 || (data[0] & 3) != KEYB_KEYREG)
268 return; /* ignore it */
269 adbhid_input_keycode(id, data[1], 0);
270 if (!(data[2] == 0xff || (data[2] == 0x7f && data[1] == 0x7f)))
271 adbhid_input_keycode(id, data[2], 0);
274 static void
275 adbhid_input_keycode(int id, int keycode, int repeat)
277 struct adbhid *ahid = adbhid[id];
278 int up_flag;
280 up_flag = (keycode & 0x80);
281 keycode &= 0x7f;
283 switch (keycode) {
284 case ADB_KEY_CAPSLOCK: /* Generate down/up events for CapsLock everytime. */
285 input_report_key(ahid->input, KEY_CAPSLOCK, 1);
286 input_report_key(ahid->input, KEY_CAPSLOCK, 0);
287 input_sync(ahid->input);
288 return;
289 #ifdef CONFIG_PPC_PMAC
290 case ADB_KEY_POWER_OLD: /* Power key on PBook 3400 needs remapping */
291 switch(pmac_call_feature(PMAC_FTR_GET_MB_INFO,
292 NULL, PMAC_MB_INFO_MODEL, 0)) {
293 case PMAC_TYPE_COMET:
294 case PMAC_TYPE_HOOPER:
295 case PMAC_TYPE_KANGA:
296 keycode = ADB_KEY_POWER;
298 break;
299 case ADB_KEY_POWER:
300 /* Fn + Command will produce a bogus "power" keycode */
301 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
302 keycode = ADB_KEY_CMD;
303 if (up_flag)
304 ahid->flags &= ~FLAG_POWER_FROM_FN;
305 else
306 ahid->flags |= FLAG_POWER_FROM_FN;
307 } else if (ahid->flags & FLAG_POWER_FROM_FN) {
308 keycode = ADB_KEY_CMD;
309 ahid->flags &= ~FLAG_POWER_FROM_FN;
311 break;
312 case ADB_KEY_FN:
313 /* Keep track of the Fn key state */
314 if (up_flag) {
315 ahid->flags &= ~FLAG_FN_KEY_PRESSED;
316 /* Emulate Fn+delete = forward delete */
317 if (ahid->flags & FLAG_EMU_FWDEL_DOWN) {
318 ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
319 keycode = ADB_KEY_FWDEL;
320 break;
322 } else
323 ahid->flags |= FLAG_FN_KEY_PRESSED;
324 /* Swallow the key press */
325 return;
326 case ADB_KEY_DEL:
327 /* Emulate Fn+delete = forward delete */
328 if (ahid->flags & FLAG_FN_KEY_PRESSED) {
329 keycode = ADB_KEY_FWDEL;
330 if (up_flag)
331 ahid->flags &= ~FLAG_EMU_FWDEL_DOWN;
332 else
333 ahid->flags |= FLAG_EMU_FWDEL_DOWN;
335 break;
336 #endif /* CONFIG_PPC_PMAC */
339 if (adbhid[id]->keycode[keycode]) {
340 input_report_key(adbhid[id]->input,
341 adbhid[id]->keycode[keycode], !up_flag);
342 input_sync(adbhid[id]->input);
343 } else
344 printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.\n", keycode,
345 up_flag ? "released" : "pressed");
349 static void
350 adbhid_mouse_input(unsigned char *data, int nb, int autopoll)
352 int id = (data[0] >> 4) & 0x0f;
354 if (!adbhid[id]) {
355 printk(KERN_ERR "ADB HID on ID %d not yet registered\n", id);
356 return;
360 Handler 1 -- 100cpi original Apple mouse protocol.
361 Handler 2 -- 200cpi original Apple mouse protocol.
363 For Apple's standard one-button mouse protocol the data array will
364 contain the following values:
366 BITS COMMENTS
367 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
368 data[1] = bxxx xxxx First button and x-axis motion.
369 data[2] = byyy yyyy Second button and y-axis motion.
371 Handler 4 -- Apple Extended mouse protocol.
373 For Apple's 3-button mouse protocol the data array will contain the
374 following values:
376 BITS COMMENTS
377 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
378 data[1] = bxxx xxxx Left button and x-axis motion.
379 data[2] = byyy yyyy Second button and y-axis motion.
380 data[3] = byyy bxxx Third button and fourth button. Y is additional
381 high bits of y-axis motion. XY is additional
382 high bits of x-axis motion.
384 MacAlly 2-button mouse protocol.
386 For MacAlly 2-button mouse protocol the data array will contain the
387 following values:
389 BITS COMMENTS
390 data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd.
391 data[1] = bxxx xxxx Left button and x-axis motion.
392 data[2] = byyy yyyy Right button and y-axis motion.
393 data[3] = ???? ???? unknown
394 data[4] = ???? ???? unknown
398 /* If it's a trackpad, we alias the second button to the first.
399 NOTE: Apple sends an ADB flush command to the trackpad when
400 the first (the real) button is released. We could do
401 this here using async flush requests.
403 switch (adbhid[id]->mouse_kind)
405 case ADBMOUSE_TRACKPAD:
406 data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80);
407 data[2] = data[2] | 0x80;
408 break;
409 case ADBMOUSE_MICROSPEED:
410 data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
411 data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
412 data[3] = (data[3] & 0x77) | ((data[3] & 0x04) << 5)
413 | (data[3] & 0x08);
414 break;
415 case ADBMOUSE_TRACKBALLPRO:
416 data[1] = (data[1] & 0x7f) | (((data[3] & 0x04) << 5)
417 & ((data[3] & 0x08) << 4));
418 data[2] = (data[2] & 0x7f) | ((data[3] & 0x01) << 7);
419 data[3] = (data[3] & 0x77) | ((data[3] & 0x02) << 6);
420 break;
421 case ADBMOUSE_MS_A3:
422 data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7);
423 data[2] = (data[2] & 0x7f) | ((data[3] & 0x02) << 6);
424 data[3] = ((data[3] & 0x04) << 5);
425 break;
426 case ADBMOUSE_MACALLY2:
427 data[3] = (data[2] & 0x80) ? 0x80 : 0x00;
428 data[2] |= 0x80; /* Right button is mapped as button 3 */
429 nb=4;
430 break;
433 input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1));
434 input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1));
436 if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD)
437 input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1));
439 input_report_rel(adbhid[id]->input, REL_X,
440 ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 ));
441 input_report_rel(adbhid[id]->input, REL_Y,
442 ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 ));
444 input_sync(adbhid[id]->input);
447 static void
448 adbhid_buttons_input(unsigned char *data, int nb, int autopoll)
450 int id = (data[0] >> 4) & 0x0f;
452 if (!adbhid[id]) {
453 printk(KERN_ERR "ADB HID on ID %d not yet registered\n", id);
454 return;
457 switch (adbhid[id]->original_handler_id) {
458 default:
459 case 0x02: /* Adjustable keyboard button device */
461 int down = (data[1] == (data[1] & 0xf));
463 switch (data[1] & 0x0f) {
464 case 0x0: /* microphone */
465 input_report_key(adbhid[id]->input, KEY_SOUND, down);
466 break;
468 case 0x1: /* mute */
469 input_report_key(adbhid[id]->input, KEY_MUTE, down);
470 break;
472 case 0x2: /* volume decrease */
473 input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
474 break;
476 case 0x3: /* volume increase */
477 input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
478 break;
480 default:
481 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
482 data[0], data[1], data[2], data[3]);
483 break;
486 break;
488 case 0x1f: /* Powerbook button device */
490 int down = (data[1] == (data[1] & 0xf));
493 * XXX: Where is the contrast control for the passive?
494 * -- Cort
497 switch (data[1] & 0x0f) {
498 case 0x8: /* mute */
499 input_report_key(adbhid[id]->input, KEY_MUTE, down);
500 break;
502 case 0x7: /* volume decrease */
503 input_report_key(adbhid[id]->input, KEY_VOLUMEDOWN, down);
504 break;
506 case 0x6: /* volume increase */
507 input_report_key(adbhid[id]->input, KEY_VOLUMEUP, down);
508 break;
510 case 0xb: /* eject */
511 input_report_key(adbhid[id]->input, KEY_EJECTCD, down);
512 break;
514 case 0xa: /* brightness decrease */
515 #ifdef CONFIG_PMAC_BACKLIGHT
516 if (down)
517 pmac_backlight_key_down();
518 #endif
519 input_report_key(adbhid[id]->input, KEY_BRIGHTNESSDOWN, down);
520 break;
522 case 0x9: /* brightness increase */
523 #ifdef CONFIG_PMAC_BACKLIGHT
524 if (down)
525 pmac_backlight_key_up();
526 #endif
527 input_report_key(adbhid[id]->input, KEY_BRIGHTNESSUP, down);
528 break;
530 case 0xc: /* videomode switch */
531 input_report_key(adbhid[id]->input, KEY_SWITCHVIDEOMODE, down);
532 break;
534 case 0xd: /* keyboard illumination toggle */
535 input_report_key(adbhid[id]->input, KEY_KBDILLUMTOGGLE, down);
536 break;
538 case 0xe: /* keyboard illumination decrease */
539 input_report_key(adbhid[id]->input, KEY_KBDILLUMDOWN, down);
540 break;
542 case 0xf:
543 switch (data[1]) {
544 case 0x8f:
545 case 0x0f:
546 /* keyboard illumination increase */
547 input_report_key(adbhid[id]->input, KEY_KBDILLUMUP, down);
548 break;
550 case 0x7f:
551 case 0xff:
552 /* keypad overlay toogle */
553 break;
555 default:
556 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
557 data[0], data[1], data[2], data[3]);
558 break;
560 break;
561 default:
562 printk(KERN_INFO "Unhandled ADB_MISC event %02x, %02x, %02x, %02x\n",
563 data[0], data[1], data[2], data[3]);
564 break;
567 break;
570 input_sync(adbhid[id]->input);
573 static struct adb_request led_request;
574 static int leds_pending[16];
575 static int leds_req_pending;
576 static int pending_devs[16];
577 static int pending_led_start;
578 static int pending_led_end;
579 static DEFINE_SPINLOCK(leds_lock);
581 static void leds_done(struct adb_request *req)
583 int leds = 0, device = 0, pending = 0;
584 unsigned long flags;
586 spin_lock_irqsave(&leds_lock, flags);
588 if (pending_led_start != pending_led_end) {
589 device = pending_devs[pending_led_start];
590 leds = leds_pending[device] & 0xff;
591 leds_pending[device] = 0;
592 pending_led_start++;
593 pending_led_start = (pending_led_start < 16) ? pending_led_start : 0;
594 pending = leds_req_pending;
595 } else
596 leds_req_pending = 0;
597 spin_unlock_irqrestore(&leds_lock, flags);
598 if (pending)
599 adb_request(&led_request, leds_done, 0, 3,
600 ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
603 static void real_leds(unsigned char leds, int device)
605 unsigned long flags;
607 spin_lock_irqsave(&leds_lock, flags);
608 if (!leds_req_pending) {
609 leds_req_pending = 1;
610 spin_unlock_irqrestore(&leds_lock, flags);
611 adb_request(&led_request, leds_done, 0, 3,
612 ADB_WRITEREG(device, KEYB_LEDREG), 0xff, ~leds);
613 return;
614 } else {
615 if (!(leds_pending[device] & 0x100)) {
616 pending_devs[pending_led_end] = device;
617 pending_led_end++;
618 pending_led_end = (pending_led_end < 16) ? pending_led_end : 0;
620 leds_pending[device] = leds | 0x100;
622 spin_unlock_irqrestore(&leds_lock, flags);
626 * Event callback from the input module. Events that change the state of
627 * the hardware are processed here.
629 static int adbhid_kbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
631 struct adbhid *adbhid = input_get_drvdata(dev);
632 unsigned char leds;
634 switch (type) {
635 case EV_LED:
636 leds = (test_bit(LED_SCROLLL, dev->led) ? 4 : 0) |
637 (test_bit(LED_NUML, dev->led) ? 1 : 0) |
638 (test_bit(LED_CAPSL, dev->led) ? 2 : 0);
639 real_leds(leds, adbhid->id);
640 return 0;
643 return -1;
646 static int
647 adb_message_handler(struct notifier_block *this, unsigned long code, void *x)
649 switch (code) {
650 case ADB_MSG_PRE_RESET:
651 case ADB_MSG_POWERDOWN:
652 /* Stop the repeat timer. Autopoll is already off at this point */
654 int i;
655 for (i = 1; i < 16; i++) {
656 if (adbhid[i])
657 del_timer_sync(&adbhid[i]->input->timer);
661 /* Stop pending led requests */
662 while(leds_req_pending)
663 adb_poll();
664 break;
666 case ADB_MSG_POST_RESET:
667 adbhid_probe();
668 break;
670 return NOTIFY_DONE;
673 static int
674 adbhid_input_register(int id, int default_id, int original_handler_id,
675 int current_handler_id, int mouse_kind)
677 struct adbhid *hid;
678 struct input_dev *input_dev;
679 int err;
680 int i;
682 if (adbhid[id]) {
683 printk(KERN_ERR "Trying to reregister ADB HID on ID %d\n", id);
684 return -EEXIST;
687 adbhid[id] = hid = kzalloc(sizeof(struct adbhid), GFP_KERNEL);
688 input_dev = input_allocate_device();
689 if (!hid || !input_dev) {
690 err = -ENOMEM;
691 goto fail;
694 sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id);
696 hid->input = input_dev;
697 hid->id = default_id;
698 hid->original_handler_id = original_handler_id;
699 hid->current_handler_id = current_handler_id;
700 hid->mouse_kind = mouse_kind;
701 hid->flags = 0;
702 input_set_drvdata(input_dev, hid);
703 input_dev->name = hid->name;
704 input_dev->phys = hid->phys;
705 input_dev->id.bustype = BUS_ADB;
706 input_dev->id.vendor = 0x0001;
707 input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id;
708 input_dev->id.version = 0x0100;
710 switch (default_id) {
711 case ADB_KEYBOARD:
712 hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL);
713 if (!hid->keycode) {
714 err = -ENOMEM;
715 goto fail;
718 sprintf(hid->name, "ADB keyboard");
720 memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
722 printk(KERN_INFO "Detected ADB keyboard, type ");
723 switch (original_handler_id) {
724 default:
725 printk("<unknown>.\n");
726 input_dev->id.version = ADB_KEYBOARD_UNKNOWN;
727 break;
729 case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
730 case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
731 case 0xC0: case 0xC3: case 0xC6:
732 printk("ANSI.\n");
733 input_dev->id.version = ADB_KEYBOARD_ANSI;
734 break;
736 case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
737 case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
738 case 0xC4: case 0xC7:
739 printk("ISO, swapping keys.\n");
740 input_dev->id.version = ADB_KEYBOARD_ISO;
741 i = hid->keycode[10];
742 hid->keycode[10] = hid->keycode[50];
743 hid->keycode[50] = i;
744 break;
746 case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
747 case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
748 printk("JIS.\n");
749 input_dev->id.version = ADB_KEYBOARD_JIS;
750 break;
753 for (i = 0; i < 128; i++)
754 if (hid->keycode[i])
755 set_bit(hid->keycode[i], input_dev->keybit);
757 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) |
758 BIT_MASK(EV_REP);
759 input_dev->ledbit[0] = BIT_MASK(LED_SCROLLL) |
760 BIT_MASK(LED_CAPSL) | BIT_MASK(LED_NUML);
761 input_dev->event = adbhid_kbd_event;
762 input_dev->keycodemax = 127;
763 input_dev->keycodesize = 1;
764 break;
766 case ADB_MOUSE:
767 sprintf(hid->name, "ADB mouse");
769 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
770 input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |
771 BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT);
772 input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
773 break;
775 case ADB_MISC:
776 switch (original_handler_id) {
777 case 0x02: /* Adjustable keyboard button device */
778 sprintf(hid->name, "ADB adjustable keyboard buttons");
779 input_dev->evbit[0] = BIT_MASK(EV_KEY) |
780 BIT_MASK(EV_REP);
781 set_bit(KEY_SOUND, input_dev->keybit);
782 set_bit(KEY_MUTE, input_dev->keybit);
783 set_bit(KEY_VOLUMEUP, input_dev->keybit);
784 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
785 break;
786 case 0x1f: /* Powerbook button device */
787 sprintf(hid->name, "ADB Powerbook buttons");
788 input_dev->evbit[0] = BIT_MASK(EV_KEY) |
789 BIT_MASK(EV_REP);
790 set_bit(KEY_MUTE, input_dev->keybit);
791 set_bit(KEY_VOLUMEUP, input_dev->keybit);
792 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
793 set_bit(KEY_BRIGHTNESSUP, input_dev->keybit);
794 set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit);
795 set_bit(KEY_EJECTCD, input_dev->keybit);
796 set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit);
797 set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit);
798 set_bit(KEY_KBDILLUMDOWN, input_dev->keybit);
799 set_bit(KEY_KBDILLUMUP, input_dev->keybit);
800 break;
802 if (hid->name[0])
803 break;
804 /* else fall through */
806 default:
807 printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n");
808 err = -ENODEV;
809 goto fail;
812 input_dev->keycode = hid->keycode;
814 err = input_register_device(input_dev);
815 if (err)
816 goto fail;
818 if (default_id == ADB_KEYBOARD) {
819 /* HACK WARNING!! This should go away as soon there is an utility
820 * to control that for event devices.
822 input_dev->rep[REP_DELAY] = 500; /* input layer default: 250 */
823 input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */
826 return 0;
828 fail: input_free_device(input_dev);
829 if (hid) {
830 kfree(hid->keycode);
831 kfree(hid);
833 adbhid[id] = NULL;
834 return err;
837 static void adbhid_input_unregister(int id)
839 input_unregister_device(adbhid[id]->input);
840 kfree(adbhid[id]->keycode);
841 kfree(adbhid[id]);
842 adbhid[id] = NULL;
846 static u16
847 adbhid_input_reregister(int id, int default_id, int org_handler_id,
848 int cur_handler_id, int mk)
850 if (adbhid[id]) {
851 if (adbhid[id]->input->id.product !=
852 ((id << 12)|(default_id << 8)|org_handler_id)) {
853 adbhid_input_unregister(id);
854 adbhid_input_register(id, default_id, org_handler_id,
855 cur_handler_id, mk);
857 } else
858 adbhid_input_register(id, default_id, org_handler_id,
859 cur_handler_id, mk);
860 return 1<<id;
863 static void
864 adbhid_input_devcleanup(u16 exist)
866 int i;
867 for(i=1; i<16; i++)
868 if (adbhid[i] && !(exist&(1<<i)))
869 adbhid_input_unregister(i);
872 static void
873 adbhid_probe(void)
875 struct adb_request req;
876 int i, default_id, org_handler_id, cur_handler_id;
877 u16 reg = 0;
879 adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
880 adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
881 adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
883 for (i = 0; i < keyboard_ids.nids; i++) {
884 int id = keyboard_ids.id[i];
886 adb_get_infos(id, &default_id, &org_handler_id);
888 /* turn off all leds */
889 adb_request(&req, NULL, ADBREQ_SYNC, 3,
890 ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
892 /* Enable full feature set of the keyboard
893 ->get it to send separate codes for left and right shift,
894 control, option keys */
895 #if 0 /* handler 5 doesn't send separate codes for R modifiers */
896 if (adb_try_handler_change(id, 5))
897 printk("ADB keyboard at %d, handler set to 5\n", id);
898 else
899 #endif
900 if (adb_try_handler_change(id, 3))
901 printk("ADB keyboard at %d, handler set to 3\n", id);
902 else
903 printk("ADB keyboard at %d, handler 1\n", id);
905 adb_get_infos(id, &default_id, &cur_handler_id);
906 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
907 cur_handler_id, 0);
910 for (i = 0; i < buttons_ids.nids; i++) {
911 int id = buttons_ids.id[i];
913 adb_get_infos(id, &default_id, &org_handler_id);
914 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
915 org_handler_id, 0);
918 /* Try to switch all mice to handler 4, or 2 for three-button
919 mode and full resolution. */
920 for (i = 0; i < mouse_ids.nids; i++) {
921 int id = mouse_ids.id[i];
922 int mouse_kind;
924 adb_get_infos(id, &default_id, &org_handler_id);
926 if (adb_try_handler_change(id, 4)) {
927 printk("ADB mouse at %d, handler set to 4", id);
928 mouse_kind = ADBMOUSE_EXTENDED;
930 else if (adb_try_handler_change(id, 0x2F)) {
931 printk("ADB mouse at %d, handler set to 0x2F", id);
932 mouse_kind = ADBMOUSE_MICROSPEED;
934 else if (adb_try_handler_change(id, 0x42)) {
935 printk("ADB mouse at %d, handler set to 0x42", id);
936 mouse_kind = ADBMOUSE_TRACKBALLPRO;
938 else if (adb_try_handler_change(id, 0x66)) {
939 printk("ADB mouse at %d, handler set to 0x66", id);
940 mouse_kind = ADBMOUSE_MICROSPEED;
942 else if (adb_try_handler_change(id, 0x5F)) {
943 printk("ADB mouse at %d, handler set to 0x5F", id);
944 mouse_kind = ADBMOUSE_MICROSPEED;
946 else if (adb_try_handler_change(id, 3)) {
947 printk("ADB mouse at %d, handler set to 3", id);
948 mouse_kind = ADBMOUSE_MS_A3;
950 else if (adb_try_handler_change(id, 2)) {
951 printk("ADB mouse at %d, handler set to 2", id);
952 mouse_kind = ADBMOUSE_STANDARD_200;
954 else {
955 printk("ADB mouse at %d, handler 1", id);
956 mouse_kind = ADBMOUSE_STANDARD_100;
959 if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
960 || (mouse_kind == ADBMOUSE_MICROSPEED)) {
961 init_microspeed(id);
962 } else if (mouse_kind == ADBMOUSE_MS_A3) {
963 init_ms_a3(id);
964 } else if (mouse_kind == ADBMOUSE_EXTENDED) {
966 * Register 1 is usually used for device
967 * identification. Here, we try to identify
968 * a known device and call the appropriate
969 * init function.
971 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
972 ADB_READREG(id, 1));
974 if ((req.reply_len) &&
975 (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
976 || (req.reply[2] == 0x20))) {
977 mouse_kind = ADBMOUSE_TRACKBALL;
978 init_trackball(id);
980 else if ((req.reply_len >= 4) &&
981 (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
982 (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
983 mouse_kind = ADBMOUSE_TRACKPAD;
984 init_trackpad(id);
986 else if ((req.reply_len >= 4) &&
987 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
988 (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
989 mouse_kind = ADBMOUSE_TURBOMOUSE5;
990 init_turbomouse(id);
992 else if ((req.reply_len == 9) &&
993 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
994 (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
995 if (adb_try_handler_change(id, 0x42)) {
996 printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
997 mouse_kind = ADBMOUSE_MACALLY2;
1001 printk("\n");
1003 adb_get_infos(id, &default_id, &cur_handler_id);
1004 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
1005 cur_handler_id, mouse_kind);
1007 adbhid_input_devcleanup(reg);
1010 static void
1011 init_trackpad(int id)
1013 struct adb_request req;
1014 unsigned char r1_buffer[8];
1016 printk(" (trackpad)");
1018 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
1019 ADB_READREG(id,1));
1020 if (req.reply_len < 8)
1021 printk("bad length for reg. 1\n");
1022 else
1024 memcpy(r1_buffer, &req.reply[1], 8);
1026 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1027 ADB_WRITEREG(id,1),
1028 r1_buffer[0],
1029 r1_buffer[1],
1030 r1_buffer[2],
1031 r1_buffer[3],
1032 r1_buffer[4],
1033 r1_buffer[5],
1034 0x0d,
1035 r1_buffer[7]);
1037 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1038 ADB_WRITEREG(id,2),
1039 0x99,
1040 0x94,
1041 0x19,
1042 0xff,
1043 0xb2,
1044 0x8a,
1045 0x1b,
1046 0x50);
1048 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1049 ADB_WRITEREG(id,1),
1050 r1_buffer[0],
1051 r1_buffer[1],
1052 r1_buffer[2],
1053 r1_buffer[3],
1054 r1_buffer[4],
1055 r1_buffer[5],
1056 0x03, /*r1_buffer[6],*/
1057 r1_buffer[7]);
1059 /* Without this flush, the trackpad may be locked up */
1060 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1064 static void
1065 init_trackball(int id)
1067 struct adb_request req;
1069 printk(" (trackman/mouseman)");
1071 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1072 ADB_WRITEREG(id,1), 00,0x81);
1074 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1075 ADB_WRITEREG(id,1), 01,0x81);
1077 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1078 ADB_WRITEREG(id,1), 02,0x81);
1080 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1081 ADB_WRITEREG(id,1), 03,0x38);
1083 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1084 ADB_WRITEREG(id,1), 00,0x81);
1086 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1087 ADB_WRITEREG(id,1), 01,0x81);
1089 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1090 ADB_WRITEREG(id,1), 02,0x81);
1092 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1093 ADB_WRITEREG(id,1), 03,0x38);
1096 static void
1097 init_turbomouse(int id)
1099 struct adb_request req;
1101 printk(" (TurboMouse 5)");
1103 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1105 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1107 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1108 ADB_WRITEREG(3,2),
1109 0xe7,
1110 0x8c,
1114 0xff,
1115 0xff,
1116 0x94);
1118 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1120 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1121 ADB_WRITEREG(3,2),
1122 0xa5,
1123 0x14,
1126 0x69,
1127 0xff,
1128 0xff,
1129 0x27);
1132 static void
1133 init_microspeed(int id)
1135 struct adb_request req;
1137 printk(" (Microspeed/MacPoint or compatible)");
1139 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1141 /* This will initialize mice using the Microspeed, MacPoint and
1142 other compatible firmware. Bit 12 enables extended protocol.
1144 Register 1 Listen (4 Bytes)
1145 0 - 3 Button is mouse (set also for double clicking!!!)
1146 4 - 7 Button is locking (affects change speed also)
1147 8 - 11 Button changes speed
1148 12 1 = Extended mouse mode, 0 = normal mouse mode
1149 13 - 15 unused 0
1150 16 - 23 normal speed
1151 24 - 31 changed speed
1153 Register 1 talk holds version and product identification information.
1154 Register 1 Talk (4 Bytes):
1155 0 - 7 Product code
1156 8 - 23 undefined, reserved
1157 24 - 31 Version number
1159 Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
1161 adb_request(&req, NULL, ADBREQ_SYNC, 5,
1162 ADB_WRITEREG(id,1),
1163 0x20, /* alt speed = 0x20 (rather slow) */
1164 0x00, /* norm speed = 0x00 (fastest) */
1165 0x10, /* extended protocol, no speed change */
1166 0x07); /* all buttons enabled as mouse buttons, no locking */
1169 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1172 static void
1173 init_ms_a3(int id)
1175 struct adb_request req;
1177 printk(" (Mouse Systems A3 Mouse, or compatible)");
1178 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1179 ADB_WRITEREG(id, 0x2),
1180 0x00,
1181 0x07);
1183 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1186 static int __init adbhid_init(void)
1188 #ifndef CONFIG_MAC
1189 if (!machine_is(chrp) && !machine_is(powermac))
1190 return 0;
1191 #endif
1193 led_request.complete = 1;
1195 adbhid_probe();
1197 blocking_notifier_chain_register(&adb_client_list,
1198 &adbhid_adb_notifier);
1200 return 0;
1203 static void __exit adbhid_exit(void)
1207 module_init(adbhid_init);
1208 module_exit(adbhid_exit);