File Index
Files and directories
Sign in
FILE

hid-apple.c

File preview with syntax highlighting.

linux-6.19.14/drivers/hid/hid-apple.c C
   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 <vojtech@suse.cz>
   7 *  Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
   8 *  Copyright (c) 2006-2007 Jiri Kosina
   9 *  Copyright (c) 2008 Jiri Slaby <jirislaby@gmail.com>
  10 *  Copyright (c) 2019 Paul Pawlowski <paul@mrarm.io>
  11 *  Copyright (c) 2023 Orlando Chamberlain <orlandoch.dev@gmail.com>
  12 *  Copyright (c) 2024 Aditya Garg <gargaditya08@live.com>
  13 */
  14
  15/*
  16 */
  17
  18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  19
  20#include <linux/device.h>
  21#include <linux/hid.h>
  22#include <linux/jiffies.h>
  23#include <linux/module.h>
  24#include <linux/slab.h>
  25#include <linux/timer.h>
  26#include <linux/string.h>
  27#include <linux/leds.h>
  28#include <dt-bindings/leds/common.h>
  29
  30#include "hid-ids.h"
  31
  32#define APPLE_RDESC_JIS		BIT(0)
  33/* BIT(1) reserved, was: APPLE_IGNORE_MOUSE */
  34#define APPLE_HAS_FN		BIT(2)
  35/* BIT(3) reserved, was: APPLE_HIDDEV */
  36#define APPLE_ISO_TILDE_QUIRK	BIT(4)
  37#define APPLE_MIGHTYMOUSE	BIT(5)
  38#define APPLE_INVERT_HWHEEL	BIT(6)
  39/* BIT(7) reserved, was: APPLE_IGNORE_HIDINPUT */
  40#define APPLE_NUMLOCK_EMULATION	BIT(8)
  41#define APPLE_RDESC_BATTERY	BIT(9)
  42#define APPLE_BACKLIGHT_CTL	BIT(10)
  43#define APPLE_IS_NON_APPLE	BIT(11)
  44#define APPLE_MAGIC_BACKLIGHT	BIT(12)
  45#define APPLE_DISABLE_FKEYS	BIT(13)
  46
  47#define APPLE_FLAG_FKEY		BIT(0)
  48#define APPLE_FLAG_TB_FKEY	BIT(1)
  49
  50#define HID_COUNTRY_INTERNATIONAL_ISO	13
  51#define APPLE_BATTERY_TIMEOUT_SEC	60
  52
  53#define HID_USAGE_MAGIC_BL			0xff00000f
  54#define APPLE_MAGIC_REPORT_ID_POWER		3
  55#define APPLE_MAGIC_REPORT_ID_BRIGHTNESS	1
  56
  57static unsigned int fnmode = 3;
  58module_param(fnmode, uint, 0644);
  59MODULE_PARM_DESC(fnmode, "Mode of fn key on Apple keyboards (0 = disabled, "
  60		"1 = fkeyslast, 2 = fkeysfirst, [3] = auto, 4 = fkeysdisabled)");
  61
  62static int iso_layout = -1;
  63module_param(iso_layout, int, 0644);
  64MODULE_PARM_DESC(iso_layout, "Swap the backtick/tilde and greater-than/less-than keys. "
  65		"([-1] = auto, 0 = disabled, 1 = enabled)");
  66
  67static unsigned int swap_opt_cmd;
  68module_param(swap_opt_cmd, uint, 0644);
  69MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\") keys. "
  70		"(For people who want to keep Windows PC keyboard muscle memory. "
  71		"[0] = as-is, Mac layout. 1 = swapped, Windows layout., 2 = swapped, Swap only left side)");
  72
  73static unsigned int swap_ctrl_cmd;
  74module_param(swap_ctrl_cmd, uint, 0644);
  75MODULE_PARM_DESC(swap_ctrl_cmd, "Swap the Control (\"Ctrl\") and Command (\"Flag\") keys. "
  76		"(For people who are used to Mac shortcuts involving Command instead of Control. "
  77		"[0] = No change. 1 = Swapped.)");
  78
  79static unsigned int swap_fn_leftctrl;
  80module_param(swap_fn_leftctrl, uint, 0644);
  81MODULE_PARM_DESC(swap_fn_leftctrl, "Swap the Fn and left Control keys. "
  82		"(For people who want to keep PC keyboard muscle memory. "
  83		"[0] = as-is, Mac layout, 1 = swapped, PC layout)");
  84
  85struct apple_non_apple_keyboard {
  86	char *name;
  87};
  88
  89struct apple_sc_backlight {
  90	struct led_classdev cdev;
  91	struct hid_device *hdev;
  92};
  93
  94struct apple_backlight_config_report {
  95	u8 report_id;
  96	u8 version;
  97	u16 backlight_off, backlight_on_min, backlight_on_max;
  98};
  99
 100struct apple_backlight_set_report {
 101	u8 report_id;
 102	u8 version;
 103	u16 backlight;
 104	u16 rate;
 105};
 106
 107struct apple_magic_backlight {
 108	struct led_classdev cdev;
 109	struct hid_report *brightness;
 110	struct hid_report *power;
 111};
 112
 113struct apple_sc {
 114	struct hid_device *hdev;
 115	unsigned long quirks;
 116	unsigned int fn_on;
 117	unsigned int fn_found;
 118	DECLARE_BITMAP(pressed_numlock, KEY_CNT);
 119	struct timer_list battery_timer;
 120	struct apple_sc_backlight *backlight;
 121};
 122
 123struct apple_key_translation {
 124	u16 from;
 125	u16 to;
 126	unsigned long flags;
 127};
 128
 129static const struct apple_key_translation magic_keyboard_alu_fn_keys[] = {
 130	{ KEY_BACKSPACE, KEY_DELETE },
 131	{ KEY_ENTER,	KEY_INSERT },
 132	{ KEY_F1,	KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
 133	{ KEY_F2,	KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
 134	{ KEY_F3,	KEY_SCALE,          APPLE_FLAG_FKEY },
 135	{ KEY_F4,	KEY_DASHBOARD,      APPLE_FLAG_FKEY },
 136	{ KEY_F6,	KEY_NUMLOCK,        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
 150static const struct apple_key_translation magic_keyboard_2015_fn_keys[] = {
 151	{ KEY_BACKSPACE, KEY_DELETE },
 152	{ KEY_ENTER,	KEY_INSERT },
 153	{ KEY_F1,	KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
 154	{ KEY_F2,	KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
 155	{ KEY_F3,	KEY_SCALE,          APPLE_FLAG_FKEY },
 156	{ KEY_F4,	KEY_DASHBOARD,      APPLE_FLAG_FKEY },
 157	{ KEY_F7,	KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
 158	{ KEY_F8,	KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
 159	{ KEY_F9,	KEY_NEXTSONG,       APPLE_FLAG_FKEY },
 160	{ KEY_F10,	KEY_MUTE,           APPLE_FLAG_FKEY },
 161	{ KEY_F11,	KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
 162	{ KEY_F12,	KEY_VOLUMEUP,       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
 170static const struct apple_key_translation magic_keyboard_2021_and_2024_fn_keys[] = {
 171	{ KEY_BACKSPACE, KEY_DELETE },
 172	{ KEY_ENTER,	KEY_INSERT },
 173	{ KEY_F1,	KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
 174	{ KEY_F2,	KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
 175	{ KEY_F3,	KEY_SCALE,          APPLE_FLAG_FKEY },
 176	{ KEY_F4,	KEY_SEARCH,         APPLE_FLAG_FKEY },
 177	{ KEY_F5,	KEY_MICMUTE,        APPLE_FLAG_FKEY },
 178	{ KEY_F6,	KEY_SLEEP,          APPLE_FLAG_FKEY },
 179	{ KEY_F7,	KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
 180	{ KEY_F8,	KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
 181	{ KEY_F9,	KEY_NEXTSONG,       APPLE_FLAG_FKEY },
 182	{ KEY_F10,	KEY_MUTE,           APPLE_FLAG_FKEY },
 183	{ KEY_F11,	KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
 184	{ KEY_F12,	KEY_VOLUMEUP,       APPLE_FLAG_FKEY },
 185	{ KEY_UP,	KEY_PAGEUP },
 186	{ KEY_DOWN,	KEY_PAGEDOWN },
 187	{ KEY_LEFT,	KEY_HOME },
 188	{ KEY_RIGHT,	KEY_END },
 189	{ }
 190};
 191
 192static const struct apple_key_translation macbookair_fn_keys[] = {
 193	{ KEY_BACKSPACE, KEY_DELETE },
 194	{ KEY_ENTER,	KEY_INSERT },
 195	{ KEY_F1,	KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
 196	{ KEY_F2,	KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
 197	{ KEY_F3,	KEY_SCALE,          APPLE_FLAG_FKEY },
 198	{ KEY_F4,	KEY_DASHBOARD,      APPLE_FLAG_FKEY },
 199	{ KEY_F6,	KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
 200	{ KEY_F7,	KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
 201	{ KEY_F8,	KEY_NEXTSONG,       APPLE_FLAG_FKEY },
 202	{ KEY_F9,	KEY_MUTE,           APPLE_FLAG_FKEY },
 203	{ KEY_F10,	KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
 204	{ KEY_F11,	KEY_VOLUMEUP,       APPLE_FLAG_FKEY },
 205	{ KEY_F12,	KEY_EJECTCD,        APPLE_FLAG_FKEY },
 206	{ KEY_UP,	KEY_PAGEUP },
 207	{ KEY_DOWN,	KEY_PAGEDOWN },
 208	{ KEY_LEFT,	KEY_HOME },
 209	{ KEY_RIGHT,	KEY_END },
 210	{ }
 211};
 212
 213static const struct apple_key_translation macbookpro_no_esc_fn_keys[] = {
 214	{ KEY_BACKSPACE, KEY_DELETE },
 215	{ KEY_ENTER,	KEY_INSERT },
 216	{ KEY_GRAVE,	KEY_ESC, APPLE_FLAG_TB_FKEY },
 217	{ KEY_1,	KEY_F1,  APPLE_FLAG_TB_FKEY },
 218	{ KEY_2,	KEY_F2,  APPLE_FLAG_TB_FKEY },
 219	{ KEY_3,	KEY_F3,  APPLE_FLAG_TB_FKEY },
 220	{ KEY_4,	KEY_F4,  APPLE_FLAG_TB_FKEY },
 221	{ KEY_5,	KEY_F5,  APPLE_FLAG_TB_FKEY },
 222	{ KEY_6,	KEY_F6,  APPLE_FLAG_TB_FKEY },
 223	{ KEY_7,	KEY_F7,  APPLE_FLAG_TB_FKEY },
 224	{ KEY_8,	KEY_F8,  APPLE_FLAG_TB_FKEY },
 225	{ KEY_9,	KEY_F9,  APPLE_FLAG_TB_FKEY },
 226	{ KEY_0,	KEY_F10, APPLE_FLAG_TB_FKEY },
 227	{ KEY_MINUS,	KEY_F11, APPLE_FLAG_TB_FKEY },
 228	{ KEY_EQUAL,	KEY_F12, APPLE_FLAG_TB_FKEY },
 229	{ KEY_UP,	KEY_PAGEUP },
 230	{ KEY_DOWN,	KEY_PAGEDOWN },
 231	{ KEY_LEFT,	KEY_HOME },
 232	{ KEY_RIGHT,	KEY_END },
 233	{ }
 234};
 235
 236static const struct apple_key_translation macbookpro_dedicated_esc_fn_keys[] = {
 237	{ KEY_BACKSPACE, KEY_DELETE },
 238	{ KEY_ENTER,	KEY_INSERT },
 239	{ KEY_1,	KEY_F1,  APPLE_FLAG_TB_FKEY },
 240	{ KEY_2,	KEY_F2,  APPLE_FLAG_TB_FKEY },
 241	{ KEY_3,	KEY_F3,  APPLE_FLAG_TB_FKEY },
 242	{ KEY_4,	KEY_F4,  APPLE_FLAG_TB_FKEY },
 243	{ KEY_5,	KEY_F5,  APPLE_FLAG_TB_FKEY },
 244	{ KEY_6,	KEY_F6,  APPLE_FLAG_TB_FKEY },
 245	{ KEY_7,	KEY_F7,  APPLE_FLAG_TB_FKEY },
 246	{ KEY_8,	KEY_F8,  APPLE_FLAG_TB_FKEY },
 247	{ KEY_9,	KEY_F9,  APPLE_FLAG_TB_FKEY },
 248	{ KEY_0,	KEY_F10, APPLE_FLAG_TB_FKEY },
 249	{ KEY_MINUS,	KEY_F11, APPLE_FLAG_TB_FKEY },
 250	{ KEY_EQUAL,	KEY_F12, APPLE_FLAG_TB_FKEY },
 251	{ KEY_UP,	KEY_PAGEUP },
 252	{ KEY_DOWN,	KEY_PAGEDOWN },
 253	{ KEY_LEFT,	KEY_HOME },
 254	{ KEY_RIGHT,	KEY_END },
 255	{ }
 256};
 257
 258static const struct apple_key_translation apple_fn_keys[] = {
 259	{ KEY_BACKSPACE, KEY_DELETE },
 260	{ KEY_ENTER,	KEY_INSERT },
 261	{ KEY_F1,	KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
 262	{ KEY_F2,	KEY_BRIGHTNESSUP,   APPLE_FLAG_FKEY },
 263	{ KEY_F3,	KEY_SCALE,          APPLE_FLAG_FKEY },
 264	{ KEY_F4,	KEY_DASHBOARD,      APPLE_FLAG_FKEY },
 265	{ KEY_F5,	KEY_KBDILLUMDOWN,   APPLE_FLAG_FKEY },
 266	{ KEY_F6,	KEY_KBDILLUMUP,     APPLE_FLAG_FKEY },
 267	{ KEY_F7,	KEY_PREVIOUSSONG,   APPLE_FLAG_FKEY },
 268	{ KEY_F8,	KEY_PLAYPAUSE,      APPLE_FLAG_FKEY },
 269	{ KEY_F9,	KEY_NEXTSONG,       APPLE_FLAG_FKEY },
 270	{ KEY_F10,	KEY_MUTE,           APPLE_FLAG_FKEY },
 271	{ KEY_F11,	KEY_VOLUMEDOWN,     APPLE_FLAG_FKEY },
 272	{ KEY_F12,	KEY_VOLUMEUP,       APPLE_FLAG_FKEY },
 273	{ KEY_UP,	KEY_PAGEUP },
 274	{ KEY_DOWN,	KEY_PAGEDOWN },
 275	{ KEY_LEFT,	KEY_HOME },
 276	{ KEY_RIGHT,	KEY_END },
 277	{ }
 278};
 279
 280static const struct apple_key_translation powerbook_fn_keys[] = {
 281	{ KEY_BACKSPACE, KEY_DELETE },
 282	{ KEY_F1,	KEY_BRIGHTNESSDOWN,     APPLE_FLAG_FKEY },
 283	{ KEY_F2,	KEY_BRIGHTNESSUP,       APPLE_FLAG_FKEY },
 284	{ KEY_F3,	KEY_MUTE,               APPLE_FLAG_FKEY },
 285	{ KEY_F4,	KEY_VOLUMEDOWN,         APPLE_FLAG_FKEY },
 286	{ KEY_F5,	KEY_VOLUMEUP,           APPLE_FLAG_FKEY },
 287	{ KEY_F6,	KEY_NUMLOCK,            APPLE_FLAG_FKEY },
 288	{ KEY_F7,	KEY_SWITCHVIDEOMODE,    APPLE_FLAG_FKEY },
 289	{ KEY_F8,	KEY_KBDILLUMTOGGLE,     APPLE_FLAG_FKEY },
 290	{ KEY_F9,	KEY_KBDILLUMDOWN,       APPLE_FLAG_FKEY },
 291	{ KEY_F10,	KEY_KBDILLUMUP,         APPLE_FLAG_FKEY },
 292	{ KEY_UP,	KEY_PAGEUP },
 293	{ KEY_DOWN,	KEY_PAGEDOWN },
 294	{ KEY_LEFT,	KEY_HOME },
 295	{ KEY_RIGHT,	KEY_END },
 296	{ }
 297};
 298
 299static const struct apple_key_translation powerbook_numlock_keys[] = {
 300	{ KEY_J,	KEY_KP1 },
 301	{ KEY_K,	KEY_KP2 },
 302	{ KEY_L,	KEY_KP3 },
 303	{ KEY_U,	KEY_KP4 },
 304	{ KEY_I,	KEY_KP5 },
 305	{ KEY_O,	KEY_KP6 },
 306	{ KEY_7,	KEY_KP7 },
 307	{ KEY_8,	KEY_KP8 },
 308	{ KEY_9,	KEY_KP9 },
 309	{ KEY_M,	KEY_KP0 },
 310	{ KEY_DOT,	KEY_KPDOT },
 311	{ KEY_SLASH,	KEY_KPPLUS },
 312	{ KEY_SEMICOLON, KEY_KPMINUS },
 313	{ KEY_P,	KEY_KPASTERISK },
 314	{ KEY_MINUS,	KEY_KPEQUAL },
 315	{ KEY_0,	KEY_KPSLASH },
 316	{ KEY_F6,	KEY_NUMLOCK },
 317	{ KEY_KPENTER,	KEY_KPENTER },
 318	{ KEY_BACKSPACE, KEY_BACKSPACE },
 319	{ }
 320};
 321
 322static const struct apple_key_translation apple_iso_keyboard[] = {
 323	{ KEY_GRAVE,	KEY_102ND },
 324	{ KEY_102ND,	KEY_GRAVE },
 325	{ }
 326};
 327
 328static const struct apple_key_translation swapped_option_cmd_keys[] = {
 329	{ KEY_LEFTALT,	KEY_LEFTMETA },
 330	{ KEY_LEFTMETA,	KEY_LEFTALT },
 331	{ KEY_RIGHTALT,	KEY_RIGHTMETA },
 332	{ KEY_RIGHTMETA, KEY_RIGHTALT },
 333	{ }
 334};
 335
 336static const struct apple_key_translation swapped_option_cmd_left_keys[] = {
 337	{ KEY_LEFTALT,	KEY_LEFTMETA },
 338	{ KEY_LEFTMETA,	KEY_LEFTALT },
 339	{ }
 340};
 341
 342static const struct apple_key_translation swapped_ctrl_cmd_keys[] = {
 343	{ KEY_LEFTCTRL,	KEY_LEFTMETA },
 344	{ KEY_LEFTMETA,	KEY_LEFTCTRL },
 345	{ KEY_RIGHTCTRL, KEY_RIGHTMETA },
 346	{ KEY_RIGHTMETA, KEY_RIGHTCTRL },
 347	{ }
 348};
 349
 350static const struct apple_key_translation swapped_fn_leftctrl_keys[] = {
 351	{ KEY_FN, KEY_LEFTCTRL },
 352	{ KEY_LEFTCTRL, KEY_FN },
 353	{ }
 354};
 355
 356static const struct apple_non_apple_keyboard non_apple_keyboards[] = {
 357	{ "SONiX KN85 Keyboard" },
 358	{ "SONiX USB DEVICE" },
 359	{ "SONiX AK870 PRO" },
 360	{ "Keychron" },
 361	{ "AONE" },
 362	{ "GANSS" },
 363	{ "Hailuck" },
 364	{ "Jamesdonkey" },
 365	{ "A3R" },
 366	{ "hfd.cn" },
 367	{ "WKB603" },
 368	{ "TH87" },			/* EPOMAKER TH87 BT mode */
 369	{ "HFD Epomaker TH87" },	/* EPOMAKER TH87 USB mode */
 370	{ "2.4G Wireless Receiver" },	/* EPOMAKER TH87 dongle */
 371};
 372
 373static bool apple_is_non_apple_keyboard(struct hid_device *hdev)
 374{
 375	int i;
 376
 377	for (i = 0; i < ARRAY_SIZE(non_apple_keyboards); i++) {
 378		char *non_apple = non_apple_keyboards[i].name;
 379
 380		if (strncmp(hdev->name, non_apple, strlen(non_apple)) == 0)
 381			return true;
 382	}
 383
 384	return false;
 385}
 386
 387static bool apple_is_omoton_kb066(struct hid_device *hdev)
 388{
 389	return hdev->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI &&
 390		strcmp(hdev->name, "Bluetooth Keyboard") == 0;
 391}
 392
 393static inline void apple_setup_key_translation(struct input_dev *input,
 394		const struct apple_key_translation *table)
 395{
 396	const struct apple_key_translation *trans;
 397
 398	for (trans = table; trans->from; trans++)
 399		set_bit(trans->to, input->keybit);
 400}
 401
 402static const struct apple_key_translation *apple_find_translation(
 403		const struct apple_key_translation *table, u16 from)
 404{
 405	const struct apple_key_translation *trans;
 406
 407	/* Look for the translation */
 408	for (trans = table; trans->from; trans++)
 409		if (trans->from == from)
 410			return trans;
 411
 412	return NULL;
 413}
 414
 415static void input_event_with_scancode(struct input_dev *input,
 416		__u8 type, __u16 code, unsigned int hid, __s32 value)
 417{
 418	if (type == EV_KEY &&
 419	    (!test_bit(code, input->key)) == value)
 420		input_event(input, EV_MSC, MSC_SCAN, hid);
 421	input_event(input, type, code, value);
 422}
 423
 424static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
 425		struct hid_usage *usage, __s32 value)
 426{
 427	struct apple_sc *asc = hid_get_drvdata(hid);
 428	const struct apple_key_translation *trans, *table;
 429	bool do_translate;
 430	u16 code = usage->code;
 431	unsigned int real_fnmode;
 432
 433	if (fnmode == 3) {
 434		if (asc->quirks & APPLE_DISABLE_FKEYS)
 435			real_fnmode = 4;
 436		else if (asc->quirks & APPLE_IS_NON_APPLE)
 437			real_fnmode = 2;
 438		else
 439			real_fnmode = 1;
 440	} else {
 441		real_fnmode = fnmode;
 442	}
 443
 444	if (swap_fn_leftctrl) {
 445		trans = apple_find_translation(swapped_fn_leftctrl_keys, code);
 446
 447		if (trans)
 448			code = trans->to;
 449	}
 450
 451	if (iso_layout > 0 || (iso_layout < 0 && (asc->quirks & APPLE_ISO_TILDE_QUIRK) &&
 452			hid->country == HID_COUNTRY_INTERNATIONAL_ISO)) {
 453		trans = apple_find_translation(apple_iso_keyboard, code);
 454
 455		if (trans)
 456			code = trans->to;
 457	}
 458
 459	if (swap_opt_cmd) {
 460		if (swap_opt_cmd == 2)
 461			trans = apple_find_translation(swapped_option_cmd_left_keys, code);
 462		else
 463			trans = apple_find_translation(swapped_option_cmd_keys, code);
 464
 465		if (trans)
 466			code = trans->to;
 467	}
 468
 469	if (swap_ctrl_cmd) {
 470		trans = apple_find_translation(swapped_ctrl_cmd_keys, code);
 471
 472		if (trans)
 473			code = trans->to;
 474	}
 475
 476	if (code == KEY_FN)
 477		asc->fn_on = !!value;
 478
 479	if (real_fnmode) {
 480		switch (hid->product) {
 481		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI:
 482		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO:
 483		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS:
 484		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI:
 485		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO:
 486		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS:
 487		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI:
 488		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO:
 489		case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS:
 490			table = magic_keyboard_alu_fn_keys;
 491			break;
 492		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015:
 493		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015:
 494			table = magic_keyboard_2015_fn_keys;
 495			break;
 496		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021:
 497		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021:
 498		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021:
 499		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024:
 500		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2024:
 501		case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2024:
 502			table = magic_keyboard_2021_and_2024_fn_keys;
 503			break;
 504		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132:
 505		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213:
 506		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680:
 507		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680_ALT:
 508			table = macbookpro_no_esc_fn_keys;
 509			break;
 510		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F:
 511		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K:
 512		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223:
 513			table = macbookpro_dedicated_esc_fn_keys;
 514			break;
 515		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K:
 516		case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K:
 517			table = apple_fn_keys;
 518			break;
 519		default:
 520			if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI &&
 521			    hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS)
 522				table = macbookair_fn_keys;
 523			else if (hid->product < 0x21d || hid->product >= 0x300)
 524				table = powerbook_fn_keys;
 525			else
 526				table = apple_fn_keys;
 527		}
 528
 529		trans = apple_find_translation(table, code);
 530
 531		if (trans) {
 532			bool from_is_set = test_bit(trans->from, input->key);
 533			bool to_is_set = test_bit(trans->to, input->key);
 534
 535			if (from_is_set)
 536				code = trans->from;
 537			else if (to_is_set)
 538				code = trans->to;
 539
 540			if (!(from_is_set || to_is_set)) {
 541				if (trans->flags & APPLE_FLAG_FKEY) {
 542					switch (real_fnmode) {
 543					case 1:
 544						do_translate = !asc->fn_on;
 545						break;
 546					case 2:
 547						do_translate = asc->fn_on;
 548						break;
 549					default:
 550						/* case 4 */
 551						do_translate = false;
 552					}
 553				} else if (trans->flags & APPLE_FLAG_TB_FKEY) {
 554					switch (real_fnmode) {
 555					case 4:
 556						do_translate = false;
 557						break;
 558					default:
 559						do_translate = asc->fn_on;
 560					}
 561				} else {
 562					do_translate = asc->fn_on;
 563				}
 564
 565				if (do_translate)
 566					code = trans->to;
 567			}
 568		}
 569
 570		if (asc->quirks & APPLE_NUMLOCK_EMULATION &&
 571				(test_bit(code, asc->pressed_numlock) ||
 572				test_bit(LED_NUML, input->led))) {
 573			trans = apple_find_translation(powerbook_numlock_keys, code);
 574
 575			if (trans) {
 576				if (value)
 577					set_bit(code, asc->pressed_numlock);
 578				else
 579					clear_bit(code, asc->pressed_numlock);
 580
 581				code = trans->to;
 582			}
 583		}
 584	}
 585
 586	if (usage->code != code) {
 587		input_event_with_scancode(input, usage->type, code, usage->hid, value);
 588
 589		return 1;
 590	}
 591
 592	return 0;
 593}
 594
 595static int apple_event(struct hid_device *hdev, struct hid_field *field,
 596		struct hid_usage *usage, __s32 value)
 597{
 598	struct apple_sc *asc = hid_get_drvdata(hdev);
 599
 600	if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput ||
 601			!usage->type)
 602		return 0;
 603
 604	if ((asc->quirks & APPLE_INVERT_HWHEEL) &&
 605			usage->code == REL_HWHEEL) {
 606		input_event_with_scancode(field->hidinput->input, usage->type,
 607				usage->code, usage->hid, -value);
 608		return 1;
 609	}
 610
 611	if ((asc->quirks & APPLE_HAS_FN) &&
 612			hidinput_apple_event(hdev, field->hidinput->input,
 613				usage, value))
 614		return 1;
 615
 616
 617	return 0;
 618}
 619
 620static int apple_fetch_battery(struct hid_device *hdev)
 621{
 622#ifdef CONFIG_HID_BATTERY_STRENGTH
 623	struct apple_sc *asc = hid_get_drvdata(hdev);
 624	struct hid_report_enum *report_enum;
 625	struct hid_report *report;
 626
 627	if (!(asc->quirks & APPLE_RDESC_BATTERY) || !hdev->battery)
 628		return -1;
 629
 630	report_enum = &hdev->report_enum[hdev->battery_report_type];
 631	report = report_enum->report_id_hash[hdev->battery_report_id];
 632
 633	if (!report || report->maxfield < 1)
 634		return -1;
 635
 636	if (hdev->battery_capacity == hdev->battery_max)
 637		return -1;
 638
 639	hid_hw_request(hdev, report, HID_REQ_GET_REPORT);
 640	return 0;
 641#else
 642	return -1;
 643#endif
 644}
 645
 646static void apple_battery_timer_tick(struct timer_list *t)
 647{
 648	struct apple_sc *asc = timer_container_of(asc, t, battery_timer);
 649	struct hid_device *hdev = asc->hdev;
 650
 651	if (apple_fetch_battery(hdev) == 0) {
 652		mod_timer(&asc->battery_timer,
 653			  jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC));
 654	}
 655}
 656
 657/*
 658 * MacBook JIS keyboard has wrong logical maximum
 659 * Magic Keyboard JIS has wrong logical maximum
 660 */
 661static const __u8 *apple_report_fixup(struct hid_device *hdev, __u8 *rdesc,
 662		unsigned int *rsize)
 663{
 664	struct apple_sc *asc = hid_get_drvdata(hdev);
 665
 666	if(*rsize >=71 && rdesc[70] == 0x65 && rdesc[64] == 0x65) {
 667		hid_info(hdev,
 668			 "fixing up Magic Keyboard JIS report descriptor\n");
 669		rdesc[64] = rdesc[70] = 0xe7;
 670	}
 671
 672	if ((asc->quirks & APPLE_RDESC_JIS) && *rsize >= 60 &&
 673			rdesc[53] == 0x65 && rdesc[59] == 0x65) {
 674		hid_info(hdev,
 675			 "fixing up MacBook JIS keyboard report descriptor\n");
 676		rdesc[53] = rdesc[59] = 0xe7;
 677	}
 678
 679	/*
 680	 * Change the usage from:
 681	 *   0x06, 0x00, 0xff, // Usage Page (Vendor Defined Page 1)  0
 682	 *   0x09, 0x0b,       // Usage (Vendor Usage 0x0b)           3
 683	 * To:
 684	 *   0x05, 0x01,       // Usage Page (Generic Desktop)        0
 685	 *   0x09, 0x06,       // Usage (Keyboard)                    2
 686	 */
 687	if ((asc->quirks & APPLE_RDESC_BATTERY) && *rsize == 83 &&
 688	    rdesc[46] == 0x84 && rdesc[58] == 0x85) {
 689		hid_info(hdev,
 690			 "fixing up Magic Keyboard battery report descriptor\n");
 691		*rsize = *rsize - 1;
 692		rdesc = rdesc + 1;
 693
 694		rdesc[0] = 0x05;
 695		rdesc[1] = 0x01;
 696		rdesc[2] = 0x09;
 697		rdesc[3] = 0x06;
 698	}
 699
 700	return rdesc;
 701}
 702
 703static void apple_setup_input(struct input_dev *input)
 704{
 705	set_bit(KEY_NUMLOCK, input->keybit);
 706
 707	/* Enable all needed keys */
 708	apple_setup_key_translation(input, apple_fn_keys);
 709	apple_setup_key_translation(input, powerbook_fn_keys);
 710	apple_setup_key_translation(input, powerbook_numlock_keys);
 711	apple_setup_key_translation(input, apple_iso_keyboard);
 712	apple_setup_key_translation(input, magic_keyboard_alu_fn_keys);
 713	apple_setup_key_translation(input, magic_keyboard_2015_fn_keys);
 714	apple_setup_key_translation(input, magic_keyboard_2021_and_2024_fn_keys);
 715	apple_setup_key_translation(input, macbookpro_no_esc_fn_keys);
 716	apple_setup_key_translation(input, macbookpro_dedicated_esc_fn_keys);
 717}
 718
 719static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi,
 720		struct hid_field *field, struct hid_usage *usage,
 721		unsigned long **bit, int *max)
 722{
 723	struct apple_sc *asc = hid_get_drvdata(hdev);
 724
 725	if (usage->hid == (HID_UP_CUSTOM | 0x0003) ||
 726			usage->hid == (HID_UP_MSVENDOR | 0x0003) ||
 727			usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) {
 728		/* The fn key on Apple USB keyboards */
 729		set_bit(EV_REP, hi->input->evbit);
 730		hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_FN);
 731		asc->fn_found = true;
 732		apple_setup_input(hi->input);
 733		return 1;
 734	}
 735
 736	/* we want the hid layer to go through standard path (set and ignore) */
 737	return 0;
 738}
 739
 740static int apple_input_mapped(struct hid_device *hdev, struct hid_input *hi,
 741		struct hid_field *field, struct hid_usage *usage,
 742		unsigned long **bit, int *max)
 743{
 744	struct apple_sc *asc = hid_get_drvdata(hdev);
 745
 746	if (asc->quirks & APPLE_MIGHTYMOUSE) {
 747		if (usage->hid == HID_GD_Z)
 748			hid_map_usage(hi, usage, bit, max, EV_REL, REL_HWHEEL);
 749		else if (usage->code == BTN_1)
 750			hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_2);
 751		else if (usage->code == BTN_2)
 752			hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_1);
 753	}
 754
 755	return 0;
 756}
 757
 758static int apple_input_configured(struct hid_device *hdev,
 759		struct hid_input *hidinput)
 760{
 761	struct apple_sc *asc = hid_get_drvdata(hdev);
 762
 763	if (((asc->quirks & APPLE_HAS_FN) && !asc->fn_found) || apple_is_omoton_kb066(hdev)) {
 764		hid_info(hdev, "Fn key not found (Apple Wireless Keyboard clone?), disabling Fn key handling\n");
 765		asc->quirks &= ~APPLE_HAS_FN;
 766	}
 767
 768	if (apple_is_non_apple_keyboard(hdev)) {
 769		hid_info(hdev, "Non-apple keyboard detected; function keys will default to fnmode=2 behavior\n");
 770		asc->quirks |= APPLE_IS_NON_APPLE;
 771	}
 772
 773	return 0;
 774}
 775
 776static bool apple_backlight_check_support(struct hid_device *hdev)
 777{
 778	int i;
 779	unsigned int hid;
 780	struct hid_report *report;
 781
 782	list_for_each_entry(report, &hdev->report_enum[HID_INPUT_REPORT].report_list, list) {
 783		for (i = 0; i < report->maxfield; i++) {
 784			hid = report->field[i]->usage->hid;
 785			if ((hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR && (hid & HID_USAGE) == 0xf)
 786				return true;
 787		}
 788	}
 789
 790	return false;
 791}
 792
 793static int apple_backlight_set(struct hid_device *hdev, u16 value, u16 rate)
 794{
 795	int ret = 0;
 796	struct apple_backlight_set_report *rep;
 797
 798	rep = kmalloc(sizeof(*rep), GFP_KERNEL);
 799	if (rep == NULL)
 800		return -ENOMEM;
 801
 802	rep->report_id = 0xB0;
 803	rep->version = 1;
 804	rep->backlight = value;
 805	rep->rate = rate;
 806
 807	ret = hid_hw_raw_request(hdev, 0xB0u, (u8 *) rep, sizeof(*rep),
 808				 HID_OUTPUT_REPORT, HID_REQ_SET_REPORT);
 809
 810	kfree(rep);
 811	return ret;
 812}
 813
 814static int apple_backlight_led_set(struct led_classdev *led_cdev,
 815	enum led_brightness brightness)
 816{
 817	struct apple_sc_backlight *backlight = container_of(led_cdev,
 818							    struct apple_sc_backlight, cdev);
 819
 820	return apple_backlight_set(backlight->hdev, brightness, 0);
 821}
 822
 823static int apple_backlight_init(struct hid_device *hdev)
 824{
 825	int ret;
 826	struct apple_sc *asc = hid_get_drvdata(hdev);
 827	struct apple_backlight_config_report *rep;
 828
 829	if (!apple_backlight_check_support(hdev))
 830		return -EINVAL;
 831
 832	rep = kmalloc(0x200, GFP_KERNEL);
 833	if (rep == NULL)
 834		return -ENOMEM;
 835
 836	ret = hid_hw_raw_request(hdev, 0xBFu, (u8 *) rep, sizeof(*rep),
 837				 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
 838	if (ret < 0) {
 839		hid_err(hdev, "backlight request failed: %d\n", ret);
 840		goto cleanup_and_exit;
 841	}
 842	if (ret < 8 || rep->version != 1) {
 843		hid_err(hdev, "backlight config struct: bad version %i\n", rep->version);
 844		ret = -EINVAL;
 845		goto cleanup_and_exit;
 846	}
 847
 848	hid_dbg(hdev, "backlight config: off=%u, on_min=%u, on_max=%u\n",
 849		rep->backlight_off, rep->backlight_on_min, rep->backlight_on_max);
 850
 851	asc->backlight = devm_kzalloc(&hdev->dev, sizeof(*asc->backlight), GFP_KERNEL);
 852	if (!asc->backlight) {
 853		ret = -ENOMEM;
 854		goto cleanup_and_exit;
 855	}
 856
 857	asc->backlight->hdev = hdev;
 858	asc->backlight->cdev.name = "apple::kbd_backlight";
 859	asc->backlight->cdev.max_brightness = rep->backlight_on_max;
 860	asc->backlight->cdev.brightness_set_blocking = apple_backlight_led_set;
 861
 862	ret = apple_backlight_set(hdev, 0, 0);
 863	if (ret < 0) {
 864		hid_err(hdev, "backlight set request failed: %d\n", ret);
 865		goto cleanup_and_exit;
 866	}
 867
 868	ret = devm_led_classdev_register(&hdev->dev, &asc->backlight->cdev);
 869
 870cleanup_and_exit:
 871	kfree(rep);
 872	return ret;
 873}
 874
 875static void apple_magic_backlight_report_set(struct hid_report *rep, s32 value, u8 rate)
 876{
 877	rep->field[0]->value[0] = value;
 878	rep->field[1]->value[0] = 0x5e; /* Mimic Windows */
 879	rep->field[1]->value[0] |= rate << 8;
 880
 881	hid_hw_request(rep->device, rep, HID_REQ_SET_REPORT);
 882}
 883
 884static void apple_magic_backlight_set(struct apple_magic_backlight *backlight,
 885				     int brightness, char rate)
 886{
 887	apple_magic_backlight_report_set(backlight->power, brightness ? 1 : 0, rate);
 888	if (brightness)
 889		apple_magic_backlight_report_set(backlight->brightness, brightness, rate);
 890}
 891
 892static int apple_magic_backlight_led_set(struct led_classdev *led_cdev,
 893					 enum led_brightness brightness)
 894{
 895	struct apple_magic_backlight *backlight = container_of(led_cdev,
 896			struct apple_magic_backlight, cdev);
 897
 898	apple_magic_backlight_set(backlight, brightness, 1);
 899	return 0;
 900}
 901
 902static int apple_magic_backlight_init(struct hid_device *hdev)
 903{
 904	struct apple_magic_backlight *backlight;
 905	struct hid_report_enum *report_enum;
 906
 907	/*
 908	 * Ensure this usb endpoint is for the keyboard backlight, not touchbar
 909	 * backlight.
 910	 */
 911	if (hdev->collection[0].usage != HID_USAGE_MAGIC_BL)
 912		return -ENODEV;
 913
 914	backlight = devm_kzalloc(&hdev->dev, sizeof(*backlight), GFP_KERNEL);
 915	if (!backlight)
 916		return -ENOMEM;
 917
 918	report_enum = &hdev->report_enum[HID_FEATURE_REPORT];
 919	backlight->brightness = report_enum->report_id_hash[APPLE_MAGIC_REPORT_ID_BRIGHTNESS];
 920	backlight->power = report_enum->report_id_hash[APPLE_MAGIC_REPORT_ID_POWER];
 921
 922	if (!backlight->brightness || backlight->brightness->maxfield < 2 ||
 923	    !backlight->power || backlight->power->maxfield < 2)
 924		return -ENODEV;
 925
 926	backlight->cdev.name = ":white:" LED_FUNCTION_KBD_BACKLIGHT;
 927	backlight->cdev.max_brightness = backlight->brightness->field[0]->logical_maximum;
 928	backlight->cdev.brightness_set_blocking = apple_magic_backlight_led_set;
 929
 930	apple_magic_backlight_set(backlight, 0, 0);
 931
 932	return devm_led_classdev_register(&hdev->dev, &backlight->cdev);
 933
 934}
 935
 936static int apple_probe(struct hid_device *hdev,
 937		const struct hid_device_id *id)
 938{
 939	unsigned long quirks = id->driver_data;
 940	struct apple_sc *asc;
 941	int ret;
 942
 943	asc = devm_kzalloc(&hdev->dev, sizeof(*asc), GFP_KERNEL);
 944	if (asc == NULL) {
 945		hid_err(hdev, "can't alloc apple descriptor\n");
 946		return -ENOMEM;
 947	}
 948
 949	asc->hdev = hdev;
 950	asc->quirks = quirks;
 951
 952	hid_set_drvdata(hdev, asc);
 953
 954	ret = hid_parse(hdev);
 955	if (ret) {
 956		hid_err(hdev, "parse failed\n");
 957		return ret;
 958	}
 959
 960	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
 961	if (ret) {
 962		hid_err(hdev, "hw start failed\n");
 963		return ret;
 964	}
 965
 966	if (quirks & APPLE_RDESC_BATTERY) {
 967		timer_setup(&asc->battery_timer, apple_battery_timer_tick, 0);
 968		mod_timer(&asc->battery_timer,
 969			  jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC));
 970		apple_fetch_battery(hdev);
 971	}
 972
 973	if (quirks & APPLE_BACKLIGHT_CTL)
 974		apple_backlight_init(hdev);
 975
 976	if (quirks & APPLE_MAGIC_BACKLIGHT) {
 977		ret = apple_magic_backlight_init(hdev);
 978		if (ret)
 979			goto out_err;
 980	}
 981
 982	return 0;
 983
 984out_err:
 985	if (quirks & APPLE_RDESC_BATTERY)
 986		timer_delete_sync(&asc->battery_timer);
 987
 988	hid_hw_stop(hdev);
 989	return ret;
 990}
 991
 992static void apple_remove(struct hid_device *hdev)
 993{
 994	struct apple_sc *asc = hid_get_drvdata(hdev);
 995
 996	if (asc->quirks & APPLE_RDESC_BATTERY)
 997		timer_delete_sync(&asc->battery_timer);
 998
 999	hid_hw_stop(hdev);
1000}
1001
1002static const struct hid_device_id apple_devices[] = {
1003	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE),
1004		.driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL },
1005
1006	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI),
1007		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1008	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO),
1009		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1010	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI),
1011		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1012	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO),
1013		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1014	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS),
1015		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1016	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI),
1017		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1018	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO),
1019		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1020			APPLE_ISO_TILDE_QUIRK },
1021	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS),
1022		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1023			APPLE_RDESC_JIS },
1024	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI),
1025		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1026	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO),
1027		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1028			APPLE_ISO_TILDE_QUIRK },
1029	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS),
1030		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1031			APPLE_RDESC_JIS },
1032	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI),
1033		.driver_data = APPLE_HAS_FN },
1034	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO),
1035		.driver_data = APPLE_HAS_FN },
1036	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS),
1037		.driver_data = APPLE_HAS_FN },
1038	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI),
1039		.driver_data = APPLE_HAS_FN },
1040	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO),
1041		.driver_data = APPLE_HAS_FN },
1042	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS),
1043		.driver_data = APPLE_HAS_FN },
1044	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI),
1045		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1046	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO),
1047		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1048			APPLE_ISO_TILDE_QUIRK },
1049	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS),
1050		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1051			APPLE_RDESC_JIS },
1052	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI),
1053		.driver_data = APPLE_HAS_FN },
1054	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI),
1055		.driver_data = APPLE_HAS_FN },
1056	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
1057		.driver_data = APPLE_HAS_FN },
1058	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
1059		.driver_data = APPLE_HAS_FN },
1060	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS),
1061		.driver_data = APPLE_HAS_FN },
1062	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
1063		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1064	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO),
1065		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1066			APPLE_ISO_TILDE_QUIRK },
1067	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO),
1068		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1069			APPLE_ISO_TILDE_QUIRK },
1070	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
1071				USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI),
1072		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1073	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
1074				USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS),
1075		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1076	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS),
1077		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1078	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015),
1079		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1080	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015),
1081		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1082	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015),
1083		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1084	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015),
1085		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1086	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI),
1087		.driver_data = APPLE_HAS_FN },
1088	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO),
1089		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1090	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS),
1091		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1092	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI),
1093		.driver_data = APPLE_HAS_FN },
1094	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO),
1095		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1096	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS),
1097		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1098	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI),
1099		.driver_data = APPLE_HAS_FN },
1100	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO),
1101		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1102	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
1103		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1104	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
1105		.driver_data = APPLE_HAS_FN },
1106	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
1107		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1108	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
1109		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1110	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
1111		.driver_data = APPLE_HAS_FN },
1112	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
1113		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1114	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
1115		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1116	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI),
1117		.driver_data = APPLE_HAS_FN },
1118	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO),
1119		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1120	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS),
1121		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1122	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI),
1123		.driver_data = APPLE_HAS_FN },
1124	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO),
1125		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1126	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS),
1127		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1128	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI),
1129		.driver_data = APPLE_HAS_FN },
1130	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO),
1131		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1132	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS),
1133		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1134	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI),
1135		.driver_data = APPLE_HAS_FN },
1136	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO),
1137		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1138	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS),
1139		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1140	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI),
1141		.driver_data = APPLE_HAS_FN },
1142	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO),
1143		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1144	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS),
1145		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1146	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI),
1147		.driver_data = APPLE_HAS_FN },
1148	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO),
1149		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1150	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS),
1151		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1152	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI),
1153		.driver_data = APPLE_HAS_FN },
1154	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO),
1155		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1156	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS),
1157		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1158	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI),
1159		.driver_data = APPLE_HAS_FN },
1160	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO),
1161		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1162	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS),
1163		.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
1164	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K),
1165		.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
1166	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132),
1167		.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1168			APPLE_DISABLE_FKEYS },
1169	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680),
1170		.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1171			APPLE_DISABLE_FKEYS },
1172	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680_ALT),
1173		.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1174			APPLE_DISABLE_FKEYS },
1175	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213),
1176		.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1177			APPLE_DISABLE_FKEYS },
1178	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K),
1179		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
1180	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223),
1181		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
1182	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K),
1183		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1184	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F),
1185		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
1186	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
1187		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1188	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
1189		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
1190			APPLE_ISO_TILDE_QUIRK },
1191	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS),
1192		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1193	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),
1194		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1195	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY),
1196		.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
1197	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021),
1198		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1199	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021),
1200		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1201	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021),
1202		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1203	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021),
1204		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1205	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021),
1206		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1207	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021),
1208		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1209	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024),
1210		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1211	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024),
1212		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1213	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2024),
1214		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1215	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2024),
1216		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1217	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2024),
1218		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY },
1219	{ HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2024),
1220		.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1221	{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT),
1222		.driver_data = APPLE_MAGIC_BACKLIGHT },
1223
1224	{ }
1225};
1226MODULE_DEVICE_TABLE(hid, apple_devices);
1227
1228static struct hid_driver apple_driver = {
1229	.name = "apple",
1230	.id_table = apple_devices,
1231	.report_fixup = apple_report_fixup,
1232	.probe = apple_probe,
1233	.remove = apple_remove,
1234	.event = apple_event,
1235	.input_mapping = apple_input_mapping,
1236	.input_mapped = apple_input_mapped,
1237	.input_configured = apple_input_configured,
1238};
1239module_hid_driver(apple_driver);
1240
1241MODULE_DESCRIPTION("Apple USB HID quirks support for Linux");
1242MODULE_LICENSE("GPL");
~/ Read-only file preview.