[PARISC] Remove GCC_VERSION usage as suggested by Adrian Bunk
[linux-2.6.22.y-op.git] / drivers / macintosh / adbhid.c
blob5066e7a8ea9cd1ca10cb7978516f3c656007a4f5
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=0;
578 static int pending_led_end=0;
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 = dev->private;
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;
695 sprintf(hid->phys, "adb%d:%d.%02x/input", id, default_id, original_handler_id);
697 hid->input = input_dev;
698 hid->id = default_id;
699 hid->original_handler_id = original_handler_id;
700 hid->current_handler_id = current_handler_id;
701 hid->mouse_kind = mouse_kind;
702 hid->flags = 0;
703 input_dev->private = hid;
704 input_dev->name = hid->name;
705 input_dev->phys = hid->phys;
706 input_dev->id.bustype = BUS_ADB;
707 input_dev->id.vendor = 0x0001;
708 input_dev->id.product = (id << 12) | (default_id << 8) | original_handler_id;
709 input_dev->id.version = 0x0100;
711 switch (default_id) {
712 case ADB_KEYBOARD:
713 hid->keycode = kmalloc(sizeof(adb_to_linux_keycodes), GFP_KERNEL);
714 if (!hid->keycode) {
715 err = -ENOMEM;
716 goto fail;
719 sprintf(hid->name, "ADB keyboard");
721 memcpy(hid->keycode, adb_to_linux_keycodes, sizeof(adb_to_linux_keycodes));
723 printk(KERN_INFO "Detected ADB keyboard, type ");
724 switch (original_handler_id) {
725 default:
726 printk("<unknown>.\n");
727 input_dev->id.version = ADB_KEYBOARD_UNKNOWN;
728 break;
730 case 0x01: case 0x02: case 0x03: case 0x06: case 0x08:
731 case 0x0C: case 0x10: case 0x18: case 0x1B: case 0x1C:
732 case 0xC0: case 0xC3: case 0xC6:
733 printk("ANSI.\n");
734 input_dev->id.version = ADB_KEYBOARD_ANSI;
735 break;
737 case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D:
738 case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1:
739 case 0xC4: case 0xC7:
740 printk("ISO, swapping keys.\n");
741 input_dev->id.version = ADB_KEYBOARD_ISO;
742 i = hid->keycode[10];
743 hid->keycode[10] = hid->keycode[50];
744 hid->keycode[50] = i;
745 break;
747 case 0x12: case 0x15: case 0x16: case 0x17: case 0x1A:
748 case 0x1E: case 0xC2: case 0xC5: case 0xC8: case 0xC9:
749 printk("JIS.\n");
750 input_dev->id.version = ADB_KEYBOARD_JIS;
751 break;
754 for (i = 0; i < 128; i++)
755 if (hid->keycode[i])
756 set_bit(hid->keycode[i], input_dev->keybit);
758 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
759 input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
760 input_dev->event = adbhid_kbd_event;
761 input_dev->keycodemax = 127;
762 input_dev->keycodesize = 1;
763 break;
765 case ADB_MOUSE:
766 sprintf(hid->name, "ADB mouse");
768 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
769 input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
770 input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
771 break;
773 case ADB_MISC:
774 switch (original_handler_id) {
775 case 0x02: /* Adjustable keyboard button device */
776 sprintf(hid->name, "ADB adjustable keyboard buttons");
777 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
778 set_bit(KEY_SOUND, input_dev->keybit);
779 set_bit(KEY_MUTE, input_dev->keybit);
780 set_bit(KEY_VOLUMEUP, input_dev->keybit);
781 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
782 break;
783 case 0x1f: /* Powerbook button device */
784 sprintf(hid->name, "ADB Powerbook buttons");
785 input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
786 set_bit(KEY_MUTE, input_dev->keybit);
787 set_bit(KEY_VOLUMEUP, input_dev->keybit);
788 set_bit(KEY_VOLUMEDOWN, input_dev->keybit);
789 set_bit(KEY_BRIGHTNESSUP, input_dev->keybit);
790 set_bit(KEY_BRIGHTNESSDOWN, input_dev->keybit);
791 set_bit(KEY_EJECTCD, input_dev->keybit);
792 set_bit(KEY_SWITCHVIDEOMODE, input_dev->keybit);
793 set_bit(KEY_KBDILLUMTOGGLE, input_dev->keybit);
794 set_bit(KEY_KBDILLUMDOWN, input_dev->keybit);
795 set_bit(KEY_KBDILLUMUP, input_dev->keybit);
796 break;
798 if (hid->name[0])
799 break;
800 /* else fall through */
802 default:
803 printk(KERN_INFO "Trying to register unknown ADB device to input layer.\n");
804 err = -ENODEV;
805 goto fail;
808 input_dev->keycode = hid->keycode;
810 input_register_device(input_dev);
812 if (default_id == ADB_KEYBOARD) {
813 /* HACK WARNING!! This should go away as soon there is an utility
814 * to control that for event devices.
816 input_dev->rep[REP_DELAY] = 500; /* input layer default: 250 */
817 input_dev->rep[REP_PERIOD] = 66; /* input layer default: 33 */
820 return 0;
822 fail: input_free_device(input_dev);
823 kfree(hid);
824 adbhid[id] = NULL;
825 return err;
828 static void adbhid_input_unregister(int id)
830 input_unregister_device(adbhid[id]->input);
831 kfree(adbhid[id]->keycode);
832 kfree(adbhid[id]);
833 adbhid[id] = NULL;
837 static u16
838 adbhid_input_reregister(int id, int default_id, int org_handler_id,
839 int cur_handler_id, int mk)
841 if (adbhid[id]) {
842 if (adbhid[id]->input->id.product !=
843 ((id << 12)|(default_id << 8)|org_handler_id)) {
844 adbhid_input_unregister(id);
845 adbhid_input_register(id, default_id, org_handler_id,
846 cur_handler_id, mk);
848 } else
849 adbhid_input_register(id, default_id, org_handler_id,
850 cur_handler_id, mk);
851 return 1<<id;
854 static void
855 adbhid_input_devcleanup(u16 exist)
857 int i;
858 for(i=1; i<16; i++)
859 if (adbhid[i] && !(exist&(1<<i)))
860 adbhid_input_unregister(i);
863 static void
864 adbhid_probe(void)
866 struct adb_request req;
867 int i, default_id, org_handler_id, cur_handler_id;
868 u16 reg = 0;
870 adb_register(ADB_MOUSE, 0, &mouse_ids, adbhid_mouse_input);
871 adb_register(ADB_KEYBOARD, 0, &keyboard_ids, adbhid_keyboard_input);
872 adb_register(ADB_MISC, 0, &buttons_ids, adbhid_buttons_input);
874 for (i = 0; i < keyboard_ids.nids; i++) {
875 int id = keyboard_ids.id[i];
877 adb_get_infos(id, &default_id, &org_handler_id);
879 /* turn off all leds */
880 adb_request(&req, NULL, ADBREQ_SYNC, 3,
881 ADB_WRITEREG(id, KEYB_LEDREG), 0xff, 0xff);
883 /* Enable full feature set of the keyboard
884 ->get it to send separate codes for left and right shift,
885 control, option keys */
886 #if 0 /* handler 5 doesn't send separate codes for R modifiers */
887 if (adb_try_handler_change(id, 5))
888 printk("ADB keyboard at %d, handler set to 5\n", id);
889 else
890 #endif
891 if (adb_try_handler_change(id, 3))
892 printk("ADB keyboard at %d, handler set to 3\n", id);
893 else
894 printk("ADB keyboard at %d, handler 1\n", id);
896 adb_get_infos(id, &default_id, &cur_handler_id);
897 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
898 cur_handler_id, 0);
901 for (i = 0; i < buttons_ids.nids; i++) {
902 int id = buttons_ids.id[i];
904 adb_get_infos(id, &default_id, &org_handler_id);
905 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
906 org_handler_id, 0);
909 /* Try to switch all mice to handler 4, or 2 for three-button
910 mode and full resolution. */
911 for (i = 0; i < mouse_ids.nids; i++) {
912 int id = mouse_ids.id[i];
913 int mouse_kind;
915 adb_get_infos(id, &default_id, &org_handler_id);
917 if (adb_try_handler_change(id, 4)) {
918 printk("ADB mouse at %d, handler set to 4", id);
919 mouse_kind = ADBMOUSE_EXTENDED;
921 else if (adb_try_handler_change(id, 0x2F)) {
922 printk("ADB mouse at %d, handler set to 0x2F", id);
923 mouse_kind = ADBMOUSE_MICROSPEED;
925 else if (adb_try_handler_change(id, 0x42)) {
926 printk("ADB mouse at %d, handler set to 0x42", id);
927 mouse_kind = ADBMOUSE_TRACKBALLPRO;
929 else if (adb_try_handler_change(id, 0x66)) {
930 printk("ADB mouse at %d, handler set to 0x66", id);
931 mouse_kind = ADBMOUSE_MICROSPEED;
933 else if (adb_try_handler_change(id, 0x5F)) {
934 printk("ADB mouse at %d, handler set to 0x5F", id);
935 mouse_kind = ADBMOUSE_MICROSPEED;
937 else if (adb_try_handler_change(id, 3)) {
938 printk("ADB mouse at %d, handler set to 3", id);
939 mouse_kind = ADBMOUSE_MS_A3;
941 else if (adb_try_handler_change(id, 2)) {
942 printk("ADB mouse at %d, handler set to 2", id);
943 mouse_kind = ADBMOUSE_STANDARD_200;
945 else {
946 printk("ADB mouse at %d, handler 1", id);
947 mouse_kind = ADBMOUSE_STANDARD_100;
950 if ((mouse_kind == ADBMOUSE_TRACKBALLPRO)
951 || (mouse_kind == ADBMOUSE_MICROSPEED)) {
952 init_microspeed(id);
953 } else if (mouse_kind == ADBMOUSE_MS_A3) {
954 init_ms_a3(id);
955 } else if (mouse_kind == ADBMOUSE_EXTENDED) {
957 * Register 1 is usually used for device
958 * identification. Here, we try to identify
959 * a known device and call the appropriate
960 * init function.
962 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
963 ADB_READREG(id, 1));
965 if ((req.reply_len) &&
966 (req.reply[1] == 0x9a) && ((req.reply[2] == 0x21)
967 || (req.reply[2] == 0x20))) {
968 mouse_kind = ADBMOUSE_TRACKBALL;
969 init_trackball(id);
971 else if ((req.reply_len >= 4) &&
972 (req.reply[1] == 0x74) && (req.reply[2] == 0x70) &&
973 (req.reply[3] == 0x61) && (req.reply[4] == 0x64)) {
974 mouse_kind = ADBMOUSE_TRACKPAD;
975 init_trackpad(id);
977 else if ((req.reply_len >= 4) &&
978 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4d) &&
979 (req.reply[3] == 0x4c) && (req.reply[4] == 0x31)) {
980 mouse_kind = ADBMOUSE_TURBOMOUSE5;
981 init_turbomouse(id);
983 else if ((req.reply_len == 9) &&
984 (req.reply[1] == 0x4b) && (req.reply[2] == 0x4f) &&
985 (req.reply[3] == 0x49) && (req.reply[4] == 0x54)) {
986 if (adb_try_handler_change(id, 0x42)) {
987 printk("\nADB MacAlly 2-button mouse at %d, handler set to 0x42", id);
988 mouse_kind = ADBMOUSE_MACALLY2;
992 printk("\n");
994 adb_get_infos(id, &default_id, &cur_handler_id);
995 reg |= adbhid_input_reregister(id, default_id, org_handler_id,
996 cur_handler_id, mouse_kind);
998 adbhid_input_devcleanup(reg);
1001 static void
1002 init_trackpad(int id)
1004 struct adb_request req;
1005 unsigned char r1_buffer[8];
1007 printk(" (trackpad)");
1009 adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
1010 ADB_READREG(id,1));
1011 if (req.reply_len < 8)
1012 printk("bad length for reg. 1\n");
1013 else
1015 memcpy(r1_buffer, &req.reply[1], 8);
1017 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1018 ADB_WRITEREG(id,1),
1019 r1_buffer[0],
1020 r1_buffer[1],
1021 r1_buffer[2],
1022 r1_buffer[3],
1023 r1_buffer[4],
1024 r1_buffer[5],
1025 0x0d,
1026 r1_buffer[7]);
1028 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1029 ADB_WRITEREG(id,2),
1030 0x99,
1031 0x94,
1032 0x19,
1033 0xff,
1034 0xb2,
1035 0x8a,
1036 0x1b,
1037 0x50);
1039 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1040 ADB_WRITEREG(id,1),
1041 r1_buffer[0],
1042 r1_buffer[1],
1043 r1_buffer[2],
1044 r1_buffer[3],
1045 r1_buffer[4],
1046 r1_buffer[5],
1047 0x03, /*r1_buffer[6],*/
1048 r1_buffer[7]);
1050 /* Without this flush, the trackpad may be locked up */
1051 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1055 static void
1056 init_trackball(int id)
1058 struct adb_request req;
1060 printk(" (trackman/mouseman)");
1062 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1063 ADB_WRITEREG(id,1), 00,0x81);
1065 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1066 ADB_WRITEREG(id,1), 01,0x81);
1068 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1069 ADB_WRITEREG(id,1), 02,0x81);
1071 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1072 ADB_WRITEREG(id,1), 03,0x38);
1074 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1075 ADB_WRITEREG(id,1), 00,0x81);
1077 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1078 ADB_WRITEREG(id,1), 01,0x81);
1080 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1081 ADB_WRITEREG(id,1), 02,0x81);
1083 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1084 ADB_WRITEREG(id,1), 03,0x38);
1087 static void
1088 init_turbomouse(int id)
1090 struct adb_request req;
1092 printk(" (TurboMouse 5)");
1094 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1096 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1098 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1099 ADB_WRITEREG(3,2),
1100 0xe7,
1101 0x8c,
1105 0xff,
1106 0xff,
1107 0x94);
1109 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
1111 adb_request(&req, NULL, ADBREQ_SYNC, 9,
1112 ADB_WRITEREG(3,2),
1113 0xa5,
1114 0x14,
1117 0x69,
1118 0xff,
1119 0xff,
1120 0x27);
1123 static void
1124 init_microspeed(int id)
1126 struct adb_request req;
1128 printk(" (Microspeed/MacPoint or compatible)");
1130 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1132 /* This will initialize mice using the Microspeed, MacPoint and
1133 other compatible firmware. Bit 12 enables extended protocol.
1135 Register 1 Listen (4 Bytes)
1136 0 - 3 Button is mouse (set also for double clicking!!!)
1137 4 - 7 Button is locking (affects change speed also)
1138 8 - 11 Button changes speed
1139 12 1 = Extended mouse mode, 0 = normal mouse mode
1140 13 - 15 unused 0
1141 16 - 23 normal speed
1142 24 - 31 changed speed
1144 Register 1 talk holds version and product identification information.
1145 Register 1 Talk (4 Bytes):
1146 0 - 7 Product code
1147 8 - 23 undefined, reserved
1148 24 - 31 Version number
1150 Speed 0 is max. 1 to 255 set speed in increments of 1/256 of max.
1152 adb_request(&req, NULL, ADBREQ_SYNC, 5,
1153 ADB_WRITEREG(id,1),
1154 0x20, /* alt speed = 0x20 (rather slow) */
1155 0x00, /* norm speed = 0x00 (fastest) */
1156 0x10, /* extended protocol, no speed change */
1157 0x07); /* all buttons enabled as mouse buttons, no locking */
1160 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1163 static void
1164 init_ms_a3(int id)
1166 struct adb_request req;
1168 printk(" (Mouse Systems A3 Mouse, or compatible)");
1169 adb_request(&req, NULL, ADBREQ_SYNC, 3,
1170 ADB_WRITEREG(id, 0x2),
1171 0x00,
1172 0x07);
1174 adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
1177 static int __init adbhid_init(void)
1179 #ifndef CONFIG_MAC
1180 if (!machine_is(chrp) && !machine_is(powermac))
1181 return 0;
1182 #endif
1184 led_request.complete = 1;
1186 adbhid_probe();
1188 blocking_notifier_chain_register(&adb_client_list,
1189 &adbhid_adb_notifier);
1191 return 0;
1194 static void __exit adbhid_exit(void)
1198 module_init(adbhid_init);
1199 module_exit(adbhid_exit);