Commit | Line | Data |
---|---|---|
2874c5fd | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
8c19a515 JS |
2 | /* |
3 | * USB HID quirks support for Linux | |
4 | * | |
5 | * Copyright (c) 1999 Andreas Gal | |
6 | * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> | |
7 | * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc | |
8 | * Copyright (c) 2006-2007 Jiri Kosina | |
8c19a515 JS |
9 | * Copyright (c) 2008 Jiri Slaby <jirislaby@gmail.com> |
10 | */ | |
11 | ||
12 | /* | |
8c19a515 JS |
13 | */ |
14 | ||
4291ee30 JP |
15 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
16 | ||
8c19a515 JS |
17 | #include <linux/device.h> |
18 | #include <linux/hid.h> | |
6e143293 | 19 | #include <linux/jiffies.h> |
8c19a515 | 20 | #include <linux/module.h> |
5a0e3ad6 | 21 | #include <linux/slab.h> |
6e143293 | 22 | #include <linux/timer.h> |
8c19a515 JS |
23 | |
24 | #include "hid-ids.h" | |
25 | ||
7f52ece2 JE |
26 | #define APPLE_RDESC_JIS BIT(0) |
27 | #define APPLE_IGNORE_MOUSE BIT(1) | |
28 | #define APPLE_HAS_FN BIT(2) | |
29 | /* BIT(3) reserved, was: APPLE_HIDDEV */ | |
30 | #define APPLE_ISO_TILDE_QUIRK BIT(4) | |
31 | #define APPLE_MIGHTYMOUSE BIT(5) | |
32 | #define APPLE_INVERT_HWHEEL BIT(6) | |
33 | /* BIT(7) reserved, was: APPLE_IGNORE_HIDINPUT */ | |
34 | #define APPLE_NUMLOCK_EMULATION BIT(8) | |
6e143293 | 35 | #define APPLE_RDESC_BATTERY BIT(9) |
8c19a515 JS |
36 | |
37 | #define APPLE_FLAG_FKEY 0x01 | |
38 | ||
bd77a0f0 | 39 | #define HID_COUNTRY_INTERNATIONAL_ISO 13 |
6e143293 | 40 | #define APPLE_BATTERY_TIMEOUT_MS 60000 |
bd77a0f0 | 41 | |
8c19a515 JS |
42 | static unsigned int fnmode = 1; |
43 | module_param(fnmode, uint, 0644); | |
44 | MODULE_PARM_DESC(fnmode, "Mode of fn key on Apple keyboards (0 = disabled, " | |
45 | "[1] = fkeyslast, 2 = fkeysfirst)"); | |
46 | ||
d58cf34a AH |
47 | static int iso_layout = -1; |
48 | module_param(iso_layout, int, 0644); | |
49 | MODULE_PARM_DESC(iso_layout, "Swap the backtick/tilde and greater-than/less-than keys. " | |
50 | "([-1] = auto, 0 = disabled, 1 = enabled)"); | |
54a6593d | 51 | |
a94c79bd | 52 | static unsigned int swap_opt_cmd; |
43c83146 NL |
53 | module_param(swap_opt_cmd, uint, 0644); |
54 | MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\") keys. " | |
55 | "(For people who want to keep Windows PC keyboard muscle memory. " | |
56 | "[0] = as-is, Mac layout. 1 = swapped, Windows layout.)"); | |
57 | ||
346338ef | 58 | static unsigned int swap_fn_leftctrl; |
59 | module_param(swap_fn_leftctrl, uint, 0644); | |
60 | MODULE_PARM_DESC(swap_fn_leftctrl, "Swap the Fn and left Control keys. " | |
61 | "(For people who want to keep PC keyboard muscle memory. " | |
62 | "[0] = as-is, Mac layout, 1 = swapped, PC layout)"); | |
63 | ||
8c19a515 | 64 | struct apple_sc { |
6e143293 | 65 | struct hid_device *hdev; |
8c19a515 JS |
66 | unsigned long quirks; |
67 | unsigned int fn_on; | |
a5d81646 | 68 | unsigned int fn_found; |
8c19a515 | 69 | DECLARE_BITMAP(pressed_numlock, KEY_CNT); |
6e143293 | 70 | struct timer_list battery_timer; |
8c19a515 JS |
71 | }; |
72 | ||
73 | struct apple_key_translation { | |
74 | u16 from; | |
75 | u16 to; | |
76 | u8 flags; | |
77 | }; | |
78 | ||
0fea6fe7 JE |
79 | static const struct apple_key_translation magic_keyboard_alu_fn_keys[] = { |
80 | { KEY_BACKSPACE, KEY_DELETE }, | |
81 | { KEY_ENTER, KEY_INSERT }, | |
82 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | |
83 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | |
84 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, | |
85 | { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, | |
86 | { KEY_F6, KEY_NUMLOCK, APPLE_FLAG_FKEY }, | |
87 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | |
88 | { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, | |
89 | { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, | |
90 | { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY }, | |
91 | { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, | |
92 | { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, | |
93 | { KEY_UP, KEY_PAGEUP }, | |
94 | { KEY_DOWN, KEY_PAGEDOWN }, | |
95 | { KEY_LEFT, KEY_HOME }, | |
96 | { KEY_RIGHT, KEY_END }, | |
97 | { } | |
98 | }; | |
99 | ||
250b369e JE |
100 | static const struct apple_key_translation magic_keyboard_2015_fn_keys[] = { |
101 | { KEY_BACKSPACE, KEY_DELETE }, | |
102 | { KEY_ENTER, KEY_INSERT }, | |
103 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | |
104 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | |
105 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, | |
106 | { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, | |
107 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | |
108 | { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, | |
109 | { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, | |
110 | { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY }, | |
111 | { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, | |
112 | { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, | |
113 | { KEY_UP, KEY_PAGEUP }, | |
114 | { KEY_DOWN, KEY_PAGEDOWN }, | |
115 | { KEY_LEFT, KEY_HOME }, | |
116 | { KEY_RIGHT, KEY_END }, | |
117 | { } | |
118 | }; | |
119 | ||
531cb569 BB |
120 | static const struct apple_key_translation apple2021_fn_keys[] = { |
121 | { KEY_BACKSPACE, KEY_DELETE }, | |
122 | { KEY_ENTER, KEY_INSERT }, | |
123 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | |
124 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | |
125 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, | |
126 | { KEY_F4, KEY_SEARCH, APPLE_FLAG_FKEY }, | |
127 | { KEY_F5, KEY_MICMUTE, APPLE_FLAG_FKEY }, | |
128 | { KEY_F6, KEY_SLEEP, APPLE_FLAG_FKEY }, | |
129 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | |
130 | { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, | |
131 | { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, | |
132 | { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY }, | |
133 | { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, | |
134 | { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, | |
135 | { KEY_UP, KEY_PAGEUP }, | |
136 | { KEY_DOWN, KEY_PAGEDOWN }, | |
137 | { KEY_LEFT, KEY_HOME }, | |
138 | { KEY_RIGHT, KEY_END }, | |
139 | { } | |
140 | }; | |
141 | ||
99b9f758 EH |
142 | static const struct apple_key_translation macbookair_fn_keys[] = { |
143 | { KEY_BACKSPACE, KEY_DELETE }, | |
144 | { KEY_ENTER, KEY_INSERT }, | |
145 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | |
146 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | |
147 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, | |
148 | { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, | |
149 | { KEY_F6, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | |
150 | { KEY_F7, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, | |
151 | { KEY_F8, KEY_NEXTSONG, APPLE_FLAG_FKEY }, | |
152 | { KEY_F9, KEY_MUTE, APPLE_FLAG_FKEY }, | |
153 | { KEY_F10, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, | |
154 | { KEY_F11, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, | |
155 | { KEY_F12, KEY_EJECTCD, APPLE_FLAG_FKEY }, | |
156 | { KEY_UP, KEY_PAGEUP }, | |
157 | { KEY_DOWN, KEY_PAGEDOWN }, | |
158 | { KEY_LEFT, KEY_HOME }, | |
159 | { KEY_RIGHT, KEY_END }, | |
160 | { } | |
161 | }; | |
162 | ||
b2ddd54e | 163 | static const struct apple_key_translation apple_fn_keys[] = { |
8c19a515 | 164 | { KEY_BACKSPACE, KEY_DELETE }, |
437184ae | 165 | { KEY_ENTER, KEY_INSERT }, |
8c19a515 JS |
166 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, |
167 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | |
437184ae HR |
168 | { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, |
169 | { KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY }, | |
8c19a515 JS |
170 | { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, |
171 | { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, | |
172 | { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, | |
173 | { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, | |
174 | { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, | |
175 | { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY }, | |
176 | { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, | |
177 | { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, | |
178 | { KEY_UP, KEY_PAGEUP }, | |
179 | { KEY_DOWN, KEY_PAGEDOWN }, | |
180 | { KEY_LEFT, KEY_HOME }, | |
181 | { KEY_RIGHT, KEY_END }, | |
182 | { } | |
183 | }; | |
184 | ||
b2ddd54e | 185 | static const struct apple_key_translation powerbook_fn_keys[] = { |
8c19a515 JS |
186 | { KEY_BACKSPACE, KEY_DELETE }, |
187 | { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, | |
188 | { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, | |
189 | { KEY_F3, KEY_MUTE, APPLE_FLAG_FKEY }, | |
190 | { KEY_F4, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, | |
191 | { KEY_F5, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, | |
192 | { KEY_F6, KEY_NUMLOCK, APPLE_FLAG_FKEY }, | |
193 | { KEY_F7, KEY_SWITCHVIDEOMODE, APPLE_FLAG_FKEY }, | |
194 | { KEY_F8, KEY_KBDILLUMTOGGLE, APPLE_FLAG_FKEY }, | |
195 | { KEY_F9, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY }, | |
196 | { KEY_F10, KEY_KBDILLUMUP, APPLE_FLAG_FKEY }, | |
197 | { KEY_UP, KEY_PAGEUP }, | |
198 | { KEY_DOWN, KEY_PAGEDOWN }, | |
199 | { KEY_LEFT, KEY_HOME }, | |
200 | { KEY_RIGHT, KEY_END }, | |
201 | { } | |
202 | }; | |
203 | ||
b2ddd54e | 204 | static const struct apple_key_translation powerbook_numlock_keys[] = { |
8c19a515 JS |
205 | { KEY_J, KEY_KP1 }, |
206 | { KEY_K, KEY_KP2 }, | |
207 | { KEY_L, KEY_KP3 }, | |
208 | { KEY_U, KEY_KP4 }, | |
209 | { KEY_I, KEY_KP5 }, | |
210 | { KEY_O, KEY_KP6 }, | |
211 | { KEY_7, KEY_KP7 }, | |
212 | { KEY_8, KEY_KP8 }, | |
213 | { KEY_9, KEY_KP9 }, | |
214 | { KEY_M, KEY_KP0 }, | |
215 | { KEY_DOT, KEY_KPDOT }, | |
216 | { KEY_SLASH, KEY_KPPLUS }, | |
217 | { KEY_SEMICOLON, KEY_KPMINUS }, | |
218 | { KEY_P, KEY_KPASTERISK }, | |
219 | { KEY_MINUS, KEY_KPEQUAL }, | |
220 | { KEY_0, KEY_KPSLASH }, | |
221 | { KEY_F6, KEY_NUMLOCK }, | |
222 | { KEY_KPENTER, KEY_KPENTER }, | |
223 | { KEY_BACKSPACE, KEY_BACKSPACE }, | |
224 | { } | |
225 | }; | |
226 | ||
b2ddd54e | 227 | static const struct apple_key_translation apple_iso_keyboard[] = { |
8c19a515 JS |
228 | { KEY_GRAVE, KEY_102ND }, |
229 | { KEY_102ND, KEY_GRAVE }, | |
230 | { } | |
231 | }; | |
232 | ||
43c83146 NL |
233 | static const struct apple_key_translation swapped_option_cmd_keys[] = { |
234 | { KEY_LEFTALT, KEY_LEFTMETA }, | |
235 | { KEY_LEFTMETA, KEY_LEFTALT }, | |
236 | { KEY_RIGHTALT, KEY_RIGHTMETA }, | |
237 | { KEY_RIGHTMETA,KEY_RIGHTALT }, | |
238 | { } | |
239 | }; | |
240 | ||
346338ef | 241 | static const struct apple_key_translation swapped_fn_leftctrl_keys[] = { |
242 | { KEY_FN, KEY_LEFTCTRL }, | |
243 | { } | |
244 | }; | |
245 | ||
f1d1b3a9 JE |
246 | static inline void apple_setup_key_translation(struct input_dev *input, |
247 | const struct apple_key_translation *table) | |
248 | { | |
249 | const struct apple_key_translation *trans; | |
250 | ||
251 | for (trans = table; trans->from; trans++) | |
252 | set_bit(trans->to, input->keybit); | |
253 | } | |
254 | ||
b2ddd54e PC |
255 | static const struct apple_key_translation *apple_find_translation( |
256 | const struct apple_key_translation *table, u16 from) | |
8c19a515 | 257 | { |
b2ddd54e | 258 | const struct apple_key_translation *trans; |
8c19a515 JS |
259 | |
260 | /* Look for the translation */ | |
261 | for (trans = table; trans->from; trans++) | |
262 | if (trans->from == from) | |
263 | return trans; | |
264 | ||
265 | return NULL; | |
266 | } | |
267 | ||
3b41fb40 VL |
268 | static void input_event_with_scancode(struct input_dev *input, |
269 | __u8 type, __u16 code, unsigned int hid, __s32 value) | |
270 | { | |
271 | if (type == EV_KEY && | |
272 | (!test_bit(code, input->key)) == value) | |
273 | input_event(input, EV_MSC, MSC_SCAN, hid); | |
274 | input_event(input, type, code, value); | |
275 | } | |
276 | ||
8c19a515 JS |
277 | static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, |
278 | struct hid_usage *usage, __s32 value) | |
279 | { | |
280 | struct apple_sc *asc = hid_get_drvdata(hid); | |
a4bc6926 | 281 | const struct apple_key_translation *trans, *table; |
aec256d0 JM |
282 | bool do_translate; |
283 | u16 code = 0; | |
8c19a515 | 284 | |
346338ef | 285 | u16 fn_keycode = (swap_fn_leftctrl) ? (KEY_LEFTCTRL) : (KEY_FN); |
286 | ||
287 | if (usage->code == fn_keycode) { | |
8c19a515 | 288 | asc->fn_on = !!value; |
3b41fb40 VL |
289 | input_event_with_scancode(input, usage->type, KEY_FN, |
290 | usage->hid, value); | |
8c19a515 JS |
291 | return 1; |
292 | } | |
293 | ||
294 | if (fnmode) { | |
0fea6fe7 JE |
295 | if (hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI || |
296 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO || | |
297 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS || | |
298 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI || | |
299 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO || | |
300 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS || | |
301 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI || | |
302 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO || | |
303 | hid->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS) | |
304 | table = magic_keyboard_alu_fn_keys; | |
250b369e JE |
305 | else if (hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015 || |
306 | hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015) | |
307 | table = magic_keyboard_2015_fn_keys; | |
0fea6fe7 JE |
308 | else if (hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021 || |
309 | hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021 || | |
310 | hid->product == USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021) | |
531cb569 BB |
311 | table = apple2021_fn_keys; |
312 | else if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && | |
a4bc6926 JK |
313 | hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) |
314 | table = macbookair_fn_keys; | |
315 | else if (hid->product < 0x21d || hid->product >= 0x300) | |
316 | table = powerbook_fn_keys; | |
317 | else | |
318 | table = apple_fn_keys; | |
319 | ||
320 | trans = apple_find_translation (table, usage->code); | |
99b9f758 | 321 | |
8c19a515 | 322 | if (trans) { |
aec256d0 JM |
323 | if (test_bit(trans->from, input->key)) |
324 | code = trans->from; | |
325 | else if (test_bit(trans->to, input->key)) | |
326 | code = trans->to; | |
327 | ||
328 | if (!code) { | |
329 | if (trans->flags & APPLE_FLAG_FKEY) { | |
330 | switch (fnmode) { | |
331 | case 1: | |
332 | do_translate = !asc->fn_on; | |
333 | break; | |
334 | case 2: | |
335 | do_translate = asc->fn_on; | |
336 | break; | |
337 | default: | |
338 | /* should never happen */ | |
339 | do_translate = false; | |
340 | } | |
341 | } else { | |
342 | do_translate = asc->fn_on; | |
343 | } | |
344 | ||
345 | code = do_translate ? trans->to : trans->from; | |
8c19a515 | 346 | } |
aec256d0 | 347 | |
3b41fb40 VL |
348 | input_event_with_scancode(input, usage->type, code, |
349 | usage->hid, value); | |
aec256d0 | 350 | return 1; |
8c19a515 JS |
351 | } |
352 | ||
353 | if (asc->quirks & APPLE_NUMLOCK_EMULATION && | |
354 | (test_bit(usage->code, asc->pressed_numlock) || | |
355 | test_bit(LED_NUML, input->led))) { | |
356 | trans = apple_find_translation(powerbook_numlock_keys, | |
357 | usage->code); | |
358 | ||
359 | if (trans) { | |
360 | if (value) | |
361 | set_bit(usage->code, | |
362 | asc->pressed_numlock); | |
363 | else | |
364 | clear_bit(usage->code, | |
365 | asc->pressed_numlock); | |
366 | ||
3b41fb40 VL |
367 | input_event_with_scancode(input, usage->type, |
368 | trans->to, usage->hid, value); | |
8c19a515 JS |
369 | } |
370 | ||
371 | return 1; | |
372 | } | |
373 | } | |
374 | ||
d58cf34a AH |
375 | if (iso_layout > 0 || (iso_layout < 0 && (asc->quirks & APPLE_ISO_TILDE_QUIRK) && |
376 | hid->country == HID_COUNTRY_INTERNATIONAL_ISO)) { | |
377 | trans = apple_find_translation(apple_iso_keyboard, usage->code); | |
378 | if (trans) { | |
379 | input_event_with_scancode(input, usage->type, | |
380 | trans->to, usage->hid, value); | |
381 | return 1; | |
8c19a515 JS |
382 | } |
383 | } | |
384 | ||
43c83146 NL |
385 | if (swap_opt_cmd) { |
386 | trans = apple_find_translation(swapped_option_cmd_keys, usage->code); | |
387 | if (trans) { | |
3b41fb40 VL |
388 | input_event_with_scancode(input, usage->type, |
389 | trans->to, usage->hid, value); | |
43c83146 NL |
390 | return 1; |
391 | } | |
392 | } | |
393 | ||
346338ef | 394 | if (swap_fn_leftctrl) { |
395 | trans = apple_find_translation(swapped_fn_leftctrl_keys, usage->code); | |
396 | if (trans) { | |
3b41fb40 VL |
397 | input_event_with_scancode(input, usage->type, |
398 | trans->to, usage->hid, value); | |
346338ef | 399 | return 1; |
400 | } | |
401 | } | |
402 | ||
8c19a515 JS |
403 | return 0; |
404 | } | |
405 | ||
406 | static int apple_event(struct hid_device *hdev, struct hid_field *field, | |
407 | struct hid_usage *usage, __s32 value) | |
408 | { | |
409 | struct apple_sc *asc = hid_get_drvdata(hdev); | |
410 | ||
411 | if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput || | |
412 | !usage->type) | |
413 | return 0; | |
414 | ||
415 | if ((asc->quirks & APPLE_INVERT_HWHEEL) && | |
416 | usage->code == REL_HWHEEL) { | |
3b41fb40 VL |
417 | input_event_with_scancode(field->hidinput->input, usage->type, |
418 | usage->code, usage->hid, -value); | |
8c19a515 JS |
419 | return 1; |
420 | } | |
421 | ||
422 | if ((asc->quirks & APPLE_HAS_FN) && | |
423 | hidinput_apple_event(hdev, field->hidinput->input, | |
424 | usage, value)) | |
425 | return 1; | |
426 | ||
427 | ||
428 | return 0; | |
429 | } | |
430 | ||
6e143293 JE |
431 | static int apple_fetch_battery(struct hid_device *hdev) |
432 | { | |
433 | #ifdef CONFIG_HID_BATTERY_STRENGTH | |
434 | struct apple_sc *asc = hid_get_drvdata(hdev); | |
435 | struct hid_report_enum *report_enum; | |
436 | struct hid_report *report; | |
437 | ||
438 | if (!(asc->quirks & APPLE_RDESC_BATTERY) || !hdev->battery) | |
439 | return -1; | |
440 | ||
441 | report_enum = &hdev->report_enum[hdev->battery_report_type]; | |
442 | report = report_enum->report_id_hash[hdev->battery_report_id]; | |
443 | ||
444 | if (!report || report->maxfield < 1) | |
445 | return -1; | |
446 | ||
447 | if (hdev->battery_capacity == hdev->battery_max) | |
448 | return -1; | |
449 | ||
450 | hid_hw_request(hdev, report, HID_REQ_GET_REPORT); | |
451 | return 0; | |
452 | #else | |
453 | return -1; | |
454 | #endif | |
455 | } | |
456 | ||
457 | static void apple_battery_timer_tick(struct timer_list *t) | |
458 | { | |
459 | struct apple_sc *asc = from_timer(asc, t, battery_timer); | |
460 | struct hid_device *hdev = asc->hdev; | |
461 | ||
462 | if (apple_fetch_battery(hdev) == 0) { | |
463 | mod_timer(&asc->battery_timer, | |
464 | jiffies + msecs_to_jiffies(APPLE_BATTERY_TIMEOUT_MS)); | |
465 | } | |
466 | } | |
467 | ||
8c19a515 JS |
468 | /* |
469 | * MacBook JIS keyboard has wrong logical maximum | |
67fd71ba | 470 | * Magic Keyboard JIS has wrong logical maximum |
8c19a515 | 471 | */ |
73e4008d NK |
472 | static __u8 *apple_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
473 | unsigned int *rsize) | |
8c19a515 JS |
474 | { |
475 | struct apple_sc *asc = hid_get_drvdata(hdev); | |
476 | ||
67fd71ba MM |
477 | if(*rsize >=71 && rdesc[70] == 0x65 && rdesc[64] == 0x65) { |
478 | hid_info(hdev, | |
479 | "fixing up Magic Keyboard JIS report descriptor\n"); | |
480 | rdesc[64] = rdesc[70] = 0xe7; | |
481 | } | |
482 | ||
73e4008d | 483 | if ((asc->quirks & APPLE_RDESC_JIS) && *rsize >= 60 && |
8c19a515 | 484 | rdesc[53] == 0x65 && rdesc[59] == 0x65) { |
4291ee30 JP |
485 | hid_info(hdev, |
486 | "fixing up MacBook JIS keyboard report descriptor\n"); | |
8c19a515 JS |
487 | rdesc[53] = rdesc[59] = 0xe7; |
488 | } | |
6e143293 JE |
489 | |
490 | /* | |
491 | * Change the usage from: | |
492 | * 0x06, 0x00, 0xff, // Usage Page (Vendor Defined Page 1) 0 | |
493 | * 0x09, 0x0b, // Usage (Vendor Usage 0x0b) 3 | |
494 | * To: | |
495 | * 0x05, 0x01, // Usage Page (Generic Desktop) 0 | |
496 | * 0x09, 0x06, // Usage (Keyboard) 2 | |
497 | */ | |
498 | if ((asc->quirks & APPLE_RDESC_BATTERY) && *rsize == 83 && | |
499 | rdesc[46] == 0x84 && rdesc[58] == 0x85) { | |
500 | hid_info(hdev, | |
501 | "fixing up Magic Keyboard battery report descriptor\n"); | |
502 | *rsize = *rsize - 1; | |
503 | rdesc = kmemdup(rdesc + 1, *rsize, GFP_KERNEL); | |
504 | if (!rdesc) | |
505 | return NULL; | |
506 | ||
507 | rdesc[0] = 0x05; | |
508 | rdesc[1] = 0x01; | |
509 | rdesc[2] = 0x09; | |
510 | rdesc[3] = 0x06; | |
511 | } | |
512 | ||
73e4008d | 513 | return rdesc; |
8c19a515 JS |
514 | } |
515 | ||
516 | static void apple_setup_input(struct input_dev *input) | |
517 | { | |
8c19a515 JS |
518 | set_bit(KEY_NUMLOCK, input->keybit); |
519 | ||
520 | /* Enable all needed keys */ | |
f1d1b3a9 JE |
521 | apple_setup_key_translation(input, apple_fn_keys); |
522 | apple_setup_key_translation(input, powerbook_fn_keys); | |
523 | apple_setup_key_translation(input, powerbook_numlock_keys); | |
524 | apple_setup_key_translation(input, apple_iso_keyboard); | |
0fea6fe7 | 525 | apple_setup_key_translation(input, magic_keyboard_alu_fn_keys); |
250b369e | 526 | apple_setup_key_translation(input, magic_keyboard_2015_fn_keys); |
f1d1b3a9 JE |
527 | apple_setup_key_translation(input, apple2021_fn_keys); |
528 | ||
529 | if (swap_fn_leftctrl) | |
530 | apple_setup_key_translation(input, swapped_fn_leftctrl_keys); | |
8c19a515 JS |
531 | } |
532 | ||
533 | static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi, | |
534 | struct hid_field *field, struct hid_usage *usage, | |
535 | unsigned long **bit, int *max) | |
536 | { | |
a5d81646 HG |
537 | struct apple_sc *asc = hid_get_drvdata(hdev); |
538 | ||
ee345492 | 539 | if (usage->hid == (HID_UP_CUSTOM | 0x0003) || |
e433be92 MB |
540 | usage->hid == (HID_UP_MSVENDOR | 0x0003) || |
541 | usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) { | |
8c19a515 JS |
542 | /* The fn key on Apple USB keyboards */ |
543 | set_bit(EV_REP, hi->input->evbit); | |
544 | hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_FN); | |
a5d81646 | 545 | asc->fn_found = true; |
8c19a515 JS |
546 | apple_setup_input(hi->input); |
547 | return 1; | |
548 | } | |
549 | ||
550 | /* we want the hid layer to go through standard path (set and ignore) */ | |
551 | return 0; | |
552 | } | |
553 | ||
554 | static int apple_input_mapped(struct hid_device *hdev, struct hid_input *hi, | |
555 | struct hid_field *field, struct hid_usage *usage, | |
556 | unsigned long **bit, int *max) | |
557 | { | |
558 | struct apple_sc *asc = hid_get_drvdata(hdev); | |
559 | ||
560 | if (asc->quirks & APPLE_MIGHTYMOUSE) { | |
561 | if (usage->hid == HID_GD_Z) | |
562 | hid_map_usage(hi, usage, bit, max, EV_REL, REL_HWHEEL); | |
563 | else if (usage->code == BTN_1) | |
564 | hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_2); | |
565 | else if (usage->code == BTN_2) | |
566 | hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_1); | |
567 | } | |
568 | ||
569 | return 0; | |
570 | } | |
571 | ||
a5d81646 HG |
572 | static int apple_input_configured(struct hid_device *hdev, |
573 | struct hid_input *hidinput) | |
574 | { | |
575 | struct apple_sc *asc = hid_get_drvdata(hdev); | |
576 | ||
577 | if ((asc->quirks & APPLE_HAS_FN) && !asc->fn_found) { | |
578 | hid_info(hdev, "Fn key not found (Apple Wireless Keyboard clone?), disabling Fn key handling\n"); | |
a5fe7864 | 579 | asc->quirks &= ~APPLE_HAS_FN; |
a5d81646 HG |
580 | } |
581 | ||
582 | return 0; | |
583 | } | |
584 | ||
8c19a515 JS |
585 | static int apple_probe(struct hid_device *hdev, |
586 | const struct hid_device_id *id) | |
587 | { | |
588 | unsigned long quirks = id->driver_data; | |
589 | struct apple_sc *asc; | |
590 | int ret; | |
591 | ||
abf832bf | 592 | asc = devm_kzalloc(&hdev->dev, sizeof(*asc), GFP_KERNEL); |
8c19a515 | 593 | if (asc == NULL) { |
4291ee30 | 594 | hid_err(hdev, "can't alloc apple descriptor\n"); |
8c19a515 JS |
595 | return -ENOMEM; |
596 | } | |
597 | ||
6e143293 | 598 | asc->hdev = hdev; |
8c19a515 JS |
599 | asc->quirks = quirks; |
600 | ||
601 | hid_set_drvdata(hdev, asc); | |
602 | ||
8c19a515 JS |
603 | ret = hid_parse(hdev); |
604 | if (ret) { | |
4291ee30 | 605 | hid_err(hdev, "parse failed\n"); |
abf832bf | 606 | return ret; |
8c19a515 JS |
607 | } |
608 | ||
cc840942 | 609 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); |
8c19a515 | 610 | if (ret) { |
4291ee30 | 611 | hid_err(hdev, "hw start failed\n"); |
abf832bf | 612 | return ret; |
8c19a515 JS |
613 | } |
614 | ||
6e143293 JE |
615 | timer_setup(&asc->battery_timer, apple_battery_timer_tick, 0); |
616 | mod_timer(&asc->battery_timer, | |
617 | jiffies + msecs_to_jiffies(APPLE_BATTERY_TIMEOUT_MS)); | |
618 | apple_fetch_battery(hdev); | |
619 | ||
8c19a515 | 620 | return 0; |
8c19a515 JS |
621 | } |
622 | ||
6e143293 JE |
623 | static void apple_remove(struct hid_device *hdev) |
624 | { | |
625 | struct apple_sc *asc = hid_get_drvdata(hdev); | |
626 | ||
627 | del_timer_sync(&asc->battery_timer); | |
628 | ||
629 | hid_hw_stop(hdev); | |
630 | } | |
631 | ||
8c19a515 | 632 | static const struct hid_device_id apple_devices[] = { |
8c19a515 JS |
633 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE), |
634 | .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL }, | |
635 | ||
636 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI), | |
b4d8e473 | 637 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 638 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO), |
b4d8e473 | 639 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 640 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI), |
b4d8e473 | 641 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 642 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO), |
bd77a0f0 | 643 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 644 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS), |
b4d8e473 | 645 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 646 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI), |
b4d8e473 | 647 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 648 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO), |
bd77a0f0 | 649 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 JS |
650 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS), |
651 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | |
b4d8e473 | 652 | APPLE_RDESC_JIS }, |
8c19a515 | 653 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI), |
b4d8e473 | 654 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 655 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO), |
bd77a0f0 | 656 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 JS |
657 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS), |
658 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | |
b4d8e473 | 659 | APPLE_RDESC_JIS }, |
fef3f571 RF |
660 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI), |
661 | .driver_data = APPLE_HAS_FN }, | |
662 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO), | |
bd77a0f0 | 663 | .driver_data = APPLE_HAS_FN }, |
fef3f571 RF |
664 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS), |
665 | .driver_data = APPLE_HAS_FN }, | |
8c19a515 JS |
666 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI), |
667 | .driver_data = APPLE_HAS_FN }, | |
668 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO), | |
bd77a0f0 | 669 | .driver_data = APPLE_HAS_FN }, |
8c19a515 JS |
670 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS), |
671 | .driver_data = APPLE_HAS_FN }, | |
672 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI), | |
b4d8e473 | 673 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 674 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO), |
bd77a0f0 | 675 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 JS |
676 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), |
677 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | |
b4d8e473 | 678 | APPLE_RDESC_JIS }, |
4a4c8799 DB |
679 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), |
680 | .driver_data = APPLE_HAS_FN }, | |
ebe0b42a HT |
681 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), |
682 | .driver_data = APPLE_HAS_FN }, | |
4a4c8799 | 683 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO), |
bd77a0f0 | 684 | .driver_data = APPLE_HAS_FN }, |
4c945426 BZ |
685 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO), |
686 | .driver_data = APPLE_HAS_FN }, | |
4a4c8799 DB |
687 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS), |
688 | .driver_data = APPLE_HAS_FN }, | |
ee8a1a0a | 689 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), |
8c19a515 | 690 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
ee8a1a0a | 691 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), |
d58cf34a AH |
692 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
693 | APPLE_ISO_TILDE_QUIRK }, | |
ad734bc1 | 694 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO), |
d58cf34a AH |
695 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
696 | APPLE_ISO_TILDE_QUIRK }, | |
0a97e1e9 AK |
697 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, |
698 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), | |
699 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | |
bd4a7ce1 HHY |
700 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, |
701 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS), | |
702 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | |
ee8a1a0a | 703 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), |
8c19a515 | 704 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
371a9dce | 705 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015), |
6e143293 | 706 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, |
371a9dce | 707 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015), |
d58cf34a | 708 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
371a9dce | 709 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015), |
6e143293 | 710 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, |
371a9dce | 711 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015), |
d58cf34a | 712 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
8c19a515 | 713 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), |
b4d8e473 | 714 | .driver_data = APPLE_HAS_FN }, |
8c19a515 | 715 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO), |
bd77a0f0 | 716 | .driver_data = APPLE_HAS_FN }, |
8c19a515 | 717 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS), |
b4d8e473 | 718 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, |
8c19a515 | 719 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), |
b4d8e473 | 720 | .driver_data = APPLE_HAS_FN }, |
8c19a515 | 721 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), |
bd77a0f0 | 722 | .driver_data = APPLE_HAS_FN }, |
8c19a515 | 723 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), |
b4d8e473 | 724 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, |
a96d6ef3 HR |
725 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), |
726 | .driver_data = APPLE_HAS_FN }, | |
727 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), | |
bd77a0f0 | 728 | .driver_data = APPLE_HAS_FN }, |
a96d6ef3 HR |
729 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), |
730 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
99b9f758 EH |
731 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI), |
732 | .driver_data = APPLE_HAS_FN }, | |
733 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO), | |
bd77a0f0 | 734 | .driver_data = APPLE_HAS_FN }, |
99b9f758 EH |
735 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS), |
736 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
737 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI), | |
738 | .driver_data = APPLE_HAS_FN }, | |
739 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO), | |
bd77a0f0 | 740 | .driver_data = APPLE_HAS_FN }, |
99b9f758 EH |
741 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS), |
742 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
47340bd9 AB |
743 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI), |
744 | .driver_data = APPLE_HAS_FN }, | |
745 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO), | |
e26a7805 | 746 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
47340bd9 AB |
747 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), |
748 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
5d922baa JD |
749 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI), |
750 | .driver_data = APPLE_HAS_FN }, | |
751 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO), | |
e26a7805 | 752 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
5d922baa JD |
753 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS), |
754 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
d762cc29 NI |
755 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), |
756 | .driver_data = APPLE_HAS_FN }, | |
757 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), | |
e26a7805 | 758 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
d762cc29 NI |
759 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS), |
760 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
213f9da8 GE |
761 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), |
762 | .driver_data = APPLE_HAS_FN }, | |
763 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), | |
e26a7805 | 764 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
213f9da8 GE |
765 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), |
766 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
b2e6ad7d RB |
767 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), |
768 | .driver_data = APPLE_HAS_FN }, | |
769 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), | |
e26a7805 | 770 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
b2e6ad7d RB |
771 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), |
772 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
8d80da90 DH |
773 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI), |
774 | .driver_data = APPLE_HAS_FN }, | |
775 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO), | |
e26a7805 | 776 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
8d80da90 DH |
777 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS), |
778 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
9d9a04ee DT |
779 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI), |
780 | .driver_data = APPLE_HAS_FN }, | |
781 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO), | |
e26a7805 | 782 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
9d9a04ee DT |
783 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS), |
784 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
a4a2c545 HR |
785 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI), |
786 | .driver_data = APPLE_HAS_FN }, | |
787 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO), | |
e26a7805 | 788 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
a4a2c545 HR |
789 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS), |
790 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | |
23aeb61e CSW |
791 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), |
792 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | |
793 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), | |
d58cf34a AH |
794 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | |
795 | APPLE_ISO_TILDE_QUIRK }, | |
23aeb61e CSW |
796 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS), |
797 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | |
8c19a515 | 798 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), |
b4d8e473 | 799 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
8c19a515 | 800 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), |
b4d8e473 | 801 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, |
0cd3be51 | 802 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021), |
8ae5c16c | 803 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, |
0cd3be51 | 804 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021), |
d58cf34a | 805 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, |
9f92d61f | 806 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021), |
cbfcfbfc | 807 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, |
9f92d61f AH |
808 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021), |
809 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | |
b2dcadef | 810 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021), |
cbfcfbfc | 811 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, |
b2dcadef AH |
812 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021), |
813 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | |
8c19a515 | 814 | |
8c19a515 JS |
815 | { } |
816 | }; | |
817 | MODULE_DEVICE_TABLE(hid, apple_devices); | |
818 | ||
819 | static struct hid_driver apple_driver = { | |
820 | .name = "apple", | |
821 | .id_table = apple_devices, | |
822 | .report_fixup = apple_report_fixup, | |
823 | .probe = apple_probe, | |
6e143293 | 824 | .remove = apple_remove, |
8c19a515 JS |
825 | .event = apple_event, |
826 | .input_mapping = apple_input_mapping, | |
827 | .input_mapped = apple_input_mapped, | |
a5d81646 | 828 | .input_configured = apple_input_configured, |
8c19a515 | 829 | }; |
f425458e | 830 | module_hid_driver(apple_driver); |
8c19a515 | 831 | |
8c19a515 | 832 | MODULE_LICENSE("GPL"); |