2 * drivers/macintosh/mac_hid.c
4 * HID support stuff for Macintosh computers.
6 * Copyright (C) 2000 Franz Sirl.
8 * This file will soon be removed in favor of an uinput userspace tool.
11 #include <linux/init.h>
12 #include <linux/proc_fs.h>
13 #include <linux/sysctl.h>
14 #include <linux/input.h>
15 #include <linux/module.h>
16 #include <linux/kbd_kern.h>
19 static struct input_dev
*emumousebtn
;
20 static int emumousebtn_input_register(void);
21 static int mouse_emulate_buttons
;
22 static int mouse_button2_keycode
= KEY_RIGHTCTRL
; /* right control key */
23 static int mouse_button3_keycode
= KEY_RIGHTALT
; /* right option key */
24 static int mouse_last_keycode
;
26 #if defined(CONFIG_SYSCTL)
27 /* file(s) in /proc/sys/dev/mac_hid */
28 static ctl_table mac_hid_files
[] = {
30 .procname
= "mouse_button_emulation",
31 .data
= &mouse_emulate_buttons
,
32 .maxlen
= sizeof(int),
34 .proc_handler
= proc_dointvec
,
37 .procname
= "mouse_button2_keycode",
38 .data
= &mouse_button2_keycode
,
39 .maxlen
= sizeof(int),
41 .proc_handler
= proc_dointvec
,
44 .procname
= "mouse_button3_keycode",
45 .data
= &mouse_button3_keycode
,
46 .maxlen
= sizeof(int),
48 .proc_handler
= proc_dointvec
,
53 /* dir in /proc/sys/dev */
54 static ctl_table mac_hid_dir
[] = {
56 .procname
= "mac_hid",
59 .child
= mac_hid_files
,
64 /* /proc/sys/dev itself, in case that is not there yet */
65 static ctl_table mac_hid_root_dir
[] = {
75 static struct ctl_table_header
*mac_hid_sysctl_header
;
77 #endif /* endif CONFIG_SYSCTL */
79 int mac_hid_mouse_emulate_buttons(int caller
, unsigned int keycode
, int down
)
83 /* Called from keyboard.c */
84 if (mouse_emulate_buttons
85 && (keycode
== mouse_button2_keycode
86 || keycode
== mouse_button3_keycode
)) {
87 if (mouse_emulate_buttons
== 1) {
88 input_report_key(emumousebtn
,
89 keycode
== mouse_button2_keycode
? BTN_MIDDLE
: BTN_RIGHT
,
91 input_sync(emumousebtn
);
94 mouse_last_keycode
= down
? keycode
: 0;
101 static struct lock_class_key emumousebtn_event_class
;
102 static struct lock_class_key emumousebtn_mutex_class
;
104 static int emumousebtn_input_register(void)
108 emumousebtn
= input_allocate_device();
112 lockdep_set_class(&emumousebtn
->event_lock
, &emumousebtn_event_class
);
113 lockdep_set_class(&emumousebtn
->mutex
, &emumousebtn_mutex_class
);
115 emumousebtn
->name
= "Macintosh mouse button emulation";
116 emumousebtn
->id
.bustype
= BUS_ADB
;
117 emumousebtn
->id
.vendor
= 0x0001;
118 emumousebtn
->id
.product
= 0x0001;
119 emumousebtn
->id
.version
= 0x0100;
121 emumousebtn
->evbit
[0] = BIT_MASK(EV_KEY
) | BIT_MASK(EV_REL
);
122 emumousebtn
->keybit
[BIT_WORD(BTN_MOUSE
)] = BIT_MASK(BTN_LEFT
) |
123 BIT_MASK(BTN_MIDDLE
) | BIT_MASK(BTN_RIGHT
);
124 emumousebtn
->relbit
[0] = BIT_MASK(REL_X
) | BIT_MASK(REL_Y
);
126 ret
= input_register_device(emumousebtn
);
128 input_free_device(emumousebtn
);
133 static int __init
mac_hid_init(void)
137 err
= emumousebtn_input_register();
141 #if defined(CONFIG_SYSCTL)
142 mac_hid_sysctl_header
= register_sysctl_table(mac_hid_root_dir
);
143 #endif /* CONFIG_SYSCTL */
148 device_initcall(mac_hid_init
);