1/* 2 * drivers/macintosh/mac_hid.c 3 * 4 * HID support stuff for Macintosh computers. 5 * 6 * Copyright (C) 2000 Franz Sirl. 7 * 8 * This file will soon be removed in favor of an uinput userspace tool. 9 */ 10 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 17 18static struct input_dev *emumousebtn; 19static int emumousebtn_input_register(void); 20static int mouse_emulate_buttons; 21static int mouse_button2_keycode = KEY_RIGHTCTRL; /* right control key */ 22static int mouse_button3_keycode = KEY_RIGHTALT; /* right option key */ 23static int mouse_last_keycode; 24 25#if defined(CONFIG_SYSCTL) 26/* file(s) in /proc/sys/dev/mac_hid */ 27static ctl_table mac_hid_files[] = { 28 { 29 .ctl_name = DEV_MAC_HID_MOUSE_BUTTON_EMULATION, 30 .procname = "mouse_button_emulation", 31 .data = &mouse_emulate_buttons, 32 .maxlen = sizeof(int), 33 .mode = 0644, 34 .proc_handler = &proc_dointvec, 35 }, 36 { 37 .ctl_name = DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE, 38 .procname = "mouse_button2_keycode", 39 .data = &mouse_button2_keycode, 40 .maxlen = sizeof(int), 41 .mode = 0644, 42 .proc_handler = &proc_dointvec, 43 }, 44 { 45 .ctl_name = DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE, 46 .procname = "mouse_button3_keycode", 47 .data = &mouse_button3_keycode, 48 .maxlen = sizeof(int), 49 .mode = 0644, 50 .proc_handler = &proc_dointvec, 51 }, 52 { .ctl_name = 0 } 53}; 54 55/* dir in /proc/sys/dev */ 56static ctl_table mac_hid_dir[] = { 57 { 58 .ctl_name = DEV_MAC_HID, 59 .procname = "mac_hid", 60 .maxlen = 0, 61 .mode = 0555, 62 .child = mac_hid_files, 63 }, 64 { .ctl_name = 0 } 65}; 66 67/* /proc/sys/dev itself, in case that is not there yet */ 68static ctl_table mac_hid_root_dir[] = { 69 { 70 .ctl_name = CTL_DEV, 71 .procname = "dev", 72 .maxlen = 0, 73 .mode = 0555, 74 .child = mac_hid_dir, 75 }, 76 { .ctl_name = 0 } 77}; 78 79static struct ctl_table_header *mac_hid_sysctl_header; 80 81#endif /* endif CONFIG_SYSCTL */ 82 83int mac_hid_mouse_emulate_buttons(int caller, unsigned int keycode, int down) 84{ 85 switch (caller) { 86 case 1: 87 /* Called from keyboard.c */ 88 if (mouse_emulate_buttons 89 && (keycode == mouse_button2_keycode 90 || keycode == mouse_button3_keycode)) { 91 if (mouse_emulate_buttons == 1) { 92 input_report_key(emumousebtn, 93 keycode == mouse_button2_keycode ? BTN_MIDDLE : BTN_RIGHT, 94 down); 95 input_sync(emumousebtn); 96 return 1; 97 } 98 mouse_last_keycode = down ? keycode : 0; 99 } 100 break; 101 } 102 return 0; 103} 104 105static int emumousebtn_input_register(void) 106{ 107 int ret; 108 109 emumousebtn = input_allocate_device(); 110 if (!emumousebtn) 111 return -ENOMEM; 112 113 emumousebtn->name = "Macintosh mouse button emulation"; 114 emumousebtn->id.bustype = BUS_ADB; 115 emumousebtn->id.vendor = 0x0001; 116 emumousebtn->id.product = 0x0001; 117 emumousebtn->id.version = 0x0100; 118 119 emumousebtn->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); 120 emumousebtn->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); 121 emumousebtn->relbit[0] = BIT(REL_X) | BIT(REL_Y); 122 123 ret = input_register_device(emumousebtn); 124 if (ret) 125 input_free_device(emumousebtn); 126 127 return ret; 128} 129 130static int __init mac_hid_init(void) 131{ 132 int err; 133 134 err = emumousebtn_input_register(); 135 if (err) 136 return err; 137 138#if defined(CONFIG_SYSCTL) 139 mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir); 140#endif /* CONFIG_SYSCTL */ 141 142 return 0; 143} 144 145device_initcall(mac_hid_init); 146