hid-apple.c 36 KB

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