| 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 |  | 
|---|
| 57 | static unsigned int fnmode = 3; | 
|---|
| 58 | module_param(fnmode, uint, 0644); | 
|---|
| 59 | MODULE_PARM_DESC(fnmode, "Mode of fn key on Apple keyboards (0 = disabled, " | 
|---|
| 60 | "1 = fkeyslast, 2 = fkeysfirst, [3] = auto, 4 = fkeysdisabled)"); | 
|---|
| 61 |  | 
|---|
| 62 | static int iso_layout = -1; | 
|---|
| 63 | module_param(iso_layout, int, 0644); | 
|---|
| 64 | MODULE_PARM_DESC(iso_layout, "Swap the backtick/tilde and greater-than/less-than keys. " | 
|---|
| 65 | "([-1] = auto, 0 = disabled, 1 = enabled)"); | 
|---|
| 66 |  | 
|---|
| 67 | static unsigned int swap_opt_cmd; | 
|---|
| 68 | module_param(swap_opt_cmd, uint, 0644); | 
|---|
| 69 | MODULE_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 |  | 
|---|
| 73 | static unsigned int swap_ctrl_cmd; | 
|---|
| 74 | module_param(swap_ctrl_cmd, uint, 0644); | 
|---|
| 75 | MODULE_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 |  | 
|---|
| 79 | static unsigned int swap_fn_leftctrl; | 
|---|
| 80 | module_param(swap_fn_leftctrl, uint, 0644); | 
|---|
| 81 | MODULE_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 |  | 
|---|
| 85 | struct apple_non_apple_keyboard { | 
|---|
| 86 | char *name; | 
|---|
| 87 | }; | 
|---|
| 88 |  | 
|---|
| 89 | struct apple_sc_backlight { | 
|---|
| 90 | struct led_classdev cdev; | 
|---|
| 91 | struct hid_device *hdev; | 
|---|
| 92 | }; | 
|---|
| 93 |  | 
|---|
| 94 | struct apple_backlight_config_report { | 
|---|
| 95 | u8 report_id; | 
|---|
| 96 | u8 version; | 
|---|
| 97 | u16 backlight_off, backlight_on_min, backlight_on_max; | 
|---|
| 98 | }; | 
|---|
| 99 |  | 
|---|
| 100 | struct apple_backlight_set_report { | 
|---|
| 101 | u8 report_id; | 
|---|
| 102 | u8 version; | 
|---|
| 103 | u16 backlight; | 
|---|
| 104 | u16 rate; | 
|---|
| 105 | }; | 
|---|
| 106 |  | 
|---|
| 107 | struct apple_magic_backlight { | 
|---|
| 108 | struct led_classdev cdev; | 
|---|
| 109 | struct hid_report *brightness; | 
|---|
| 110 | struct hid_report *power; | 
|---|
| 111 | }; | 
|---|
| 112 |  | 
|---|
| 113 | struct 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 |  | 
|---|
| 123 | struct apple_key_translation { | 
|---|
| 124 | u16 from; | 
|---|
| 125 | u16 to; | 
|---|
| 126 | unsigned long flags; | 
|---|
| 127 | }; | 
|---|
| 128 |  | 
|---|
| 129 | static 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 |  | 
|---|
| 150 | static 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 |  | 
|---|
| 170 | static 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 |  | 
|---|
| 192 | static 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 |  | 
|---|
| 213 | static 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 |  | 
|---|
| 236 | static 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 |  | 
|---|
| 258 | static 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 |  | 
|---|
| 280 | static 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 |  | 
|---|
| 299 | static 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 |  | 
|---|
| 322 | static const struct apple_key_translation apple_iso_keyboard[] = { | 
|---|
| 323 | { KEY_GRAVE,	KEY_102ND }, | 
|---|
| 324 | { KEY_102ND,	KEY_GRAVE }, | 
|---|
| 325 | { } | 
|---|
| 326 | }; | 
|---|
| 327 |  | 
|---|
| 328 | static 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 |  | 
|---|
| 336 | static const struct apple_key_translation swapped_option_cmd_left_keys[] = { | 
|---|
| 337 | { KEY_LEFTALT,	KEY_LEFTMETA }, | 
|---|
| 338 | { KEY_LEFTMETA,	KEY_LEFTALT }, | 
|---|
| 339 | { } | 
|---|
| 340 | }; | 
|---|
| 341 |  | 
|---|
| 342 | static 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 |  | 
|---|
| 350 | static const struct apple_key_translation swapped_fn_leftctrl_keys[] = { | 
|---|
| 351 | { KEY_FN, KEY_LEFTCTRL }, | 
|---|
| 352 | { KEY_LEFTCTRL, KEY_FN }, | 
|---|
| 353 | { } | 
|---|
| 354 | }; | 
|---|
| 355 |  | 
|---|
| 356 | static const struct apple_non_apple_keyboard non_apple_keyboards[] = { | 
|---|
| 357 | { "SONiX USB DEVICE"}, | 
|---|
| 358 | { "Keychron"}, | 
|---|
| 359 | { "AONE"}, | 
|---|
| 360 | { "GANSS"}, | 
|---|
| 361 | { "Hailuck"}, | 
|---|
| 362 | { "Jamesdonkey"}, | 
|---|
| 363 | { "A3R"}, | 
|---|
| 364 | { "hfd.cn"}, | 
|---|
| 365 | { "WKB603"}, | 
|---|
| 366 | }; | 
|---|
| 367 |  | 
|---|
| 368 | static bool apple_is_non_apple_keyboard(struct hid_device *hdev) | 
|---|
| 369 | { | 
|---|
| 370 | int i; | 
|---|
| 371 |  | 
|---|
| 372 | for (i = 0; i < ARRAY_SIZE(non_apple_keyboards); i++) { | 
|---|
| 373 | char *non_apple = non_apple_keyboards[i].name; | 
|---|
| 374 |  | 
|---|
| 375 | if (strncmp(hdev->name, non_apple, strlen(non_apple)) == 0) | 
|---|
| 376 | return true; | 
|---|
| 377 | } | 
|---|
| 378 |  | 
|---|
| 379 | return false; | 
|---|
| 380 | } | 
|---|
| 381 |  | 
|---|
| 382 | static bool apple_is_omoton_kb066(struct hid_device *hdev) | 
|---|
| 383 | { | 
|---|
| 384 | return hdev->product == USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI && | 
|---|
| 385 | strcmp(hdev->name, "Bluetooth Keyboard") == 0; | 
|---|
| 386 | } | 
|---|
| 387 |  | 
|---|
| 388 | static inline void apple_setup_key_translation(struct input_dev *input, | 
|---|
| 389 | const struct apple_key_translation *table) | 
|---|
| 390 | { | 
|---|
| 391 | const struct apple_key_translation *trans; | 
|---|
| 392 |  | 
|---|
| 393 | for (trans = table; trans->from; trans++) | 
|---|
| 394 | set_bit(nr: trans->to, addr: input->keybit); | 
|---|
| 395 | } | 
|---|
| 396 |  | 
|---|
| 397 | static const struct apple_key_translation *apple_find_translation( | 
|---|
| 398 | const struct apple_key_translation *table, u16 from) | 
|---|
| 399 | { | 
|---|
| 400 | const struct apple_key_translation *trans; | 
|---|
| 401 |  | 
|---|
| 402 | /* Look for the translation */ | 
|---|
| 403 | for (trans = table; trans->from; trans++) | 
|---|
| 404 | if (trans->from == from) | 
|---|
| 405 | return trans; | 
|---|
| 406 |  | 
|---|
| 407 | return NULL; | 
|---|
| 408 | } | 
|---|
| 409 |  | 
|---|
| 410 | static void input_event_with_scancode(struct input_dev *input, | 
|---|
| 411 | __u8 type, __u16 code, unsigned int hid, __s32 value) | 
|---|
| 412 | { | 
|---|
| 413 | if (type == EV_KEY && | 
|---|
| 414 | (!test_bit(code, input->key)) == value) | 
|---|
| 415 | input_event(dev: input, EV_MSC, MSC_SCAN, value: hid); | 
|---|
| 416 | input_event(dev: input, type, code, value); | 
|---|
| 417 | } | 
|---|
| 418 |  | 
|---|
| 419 | static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, | 
|---|
| 420 | struct hid_usage *usage, __s32 value) | 
|---|
| 421 | { | 
|---|
| 422 | struct apple_sc *asc = hid_get_drvdata(hdev: hid); | 
|---|
| 423 | const struct apple_key_translation *trans, *table; | 
|---|
| 424 | bool do_translate; | 
|---|
| 425 | u16 code = usage->code; | 
|---|
| 426 | unsigned int real_fnmode; | 
|---|
| 427 |  | 
|---|
| 428 | if (fnmode == 3) { | 
|---|
| 429 | if (asc->quirks & APPLE_DISABLE_FKEYS) | 
|---|
| 430 | real_fnmode = 4; | 
|---|
| 431 | else if (asc->quirks & APPLE_IS_NON_APPLE) | 
|---|
| 432 | real_fnmode = 2; | 
|---|
| 433 | else | 
|---|
| 434 | real_fnmode = 1; | 
|---|
| 435 | } else { | 
|---|
| 436 | real_fnmode = fnmode; | 
|---|
| 437 | } | 
|---|
| 438 |  | 
|---|
| 439 | if (swap_fn_leftctrl) { | 
|---|
| 440 | trans = apple_find_translation(table: swapped_fn_leftctrl_keys, from: code); | 
|---|
| 441 |  | 
|---|
| 442 | if (trans) | 
|---|
| 443 | code = trans->to; | 
|---|
| 444 | } | 
|---|
| 445 |  | 
|---|
| 446 | if (iso_layout > 0 || (iso_layout < 0 && (asc->quirks & APPLE_ISO_TILDE_QUIRK) && | 
|---|
| 447 | hid->country == HID_COUNTRY_INTERNATIONAL_ISO)) { | 
|---|
| 448 | trans = apple_find_translation(table: apple_iso_keyboard, from: code); | 
|---|
| 449 |  | 
|---|
| 450 | if (trans) | 
|---|
| 451 | code = trans->to; | 
|---|
| 452 | } | 
|---|
| 453 |  | 
|---|
| 454 | if (swap_opt_cmd) { | 
|---|
| 455 | if (swap_opt_cmd == 2) | 
|---|
| 456 | trans = apple_find_translation(table: swapped_option_cmd_left_keys, from: code); | 
|---|
| 457 | else | 
|---|
| 458 | trans = apple_find_translation(table: swapped_option_cmd_keys, from: code); | 
|---|
| 459 |  | 
|---|
| 460 | if (trans) | 
|---|
| 461 | code = trans->to; | 
|---|
| 462 | } | 
|---|
| 463 |  | 
|---|
| 464 | if (swap_ctrl_cmd) { | 
|---|
| 465 | trans = apple_find_translation(table: swapped_ctrl_cmd_keys, from: code); | 
|---|
| 466 |  | 
|---|
| 467 | if (trans) | 
|---|
| 468 | code = trans->to; | 
|---|
| 469 | } | 
|---|
| 470 |  | 
|---|
| 471 | if (code == KEY_FN) | 
|---|
| 472 | asc->fn_on = !!value; | 
|---|
| 473 |  | 
|---|
| 474 | if (real_fnmode) { | 
|---|
| 475 | switch (hid->product) { | 
|---|
| 476 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI: | 
|---|
| 477 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO: | 
|---|
| 478 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS: | 
|---|
| 479 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI: | 
|---|
| 480 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO: | 
|---|
| 481 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS: | 
|---|
| 482 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI: | 
|---|
| 483 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO: | 
|---|
| 484 | case USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS: | 
|---|
| 485 | table = magic_keyboard_alu_fn_keys; | 
|---|
| 486 | break; | 
|---|
| 487 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015: | 
|---|
| 488 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015: | 
|---|
| 489 | table = magic_keyboard_2015_fn_keys; | 
|---|
| 490 | break; | 
|---|
| 491 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021: | 
|---|
| 492 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021: | 
|---|
| 493 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021: | 
|---|
| 494 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024: | 
|---|
| 495 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2024: | 
|---|
| 496 | case USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2024: | 
|---|
| 497 | table = magic_keyboard_2021_and_2024_fn_keys; | 
|---|
| 498 | break; | 
|---|
| 499 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132: | 
|---|
| 500 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213: | 
|---|
| 501 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680: | 
|---|
| 502 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680_ALT: | 
|---|
| 503 | table = macbookpro_no_esc_fn_keys; | 
|---|
| 504 | break; | 
|---|
| 505 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F: | 
|---|
| 506 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K: | 
|---|
| 507 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223: | 
|---|
| 508 | table = macbookpro_dedicated_esc_fn_keys; | 
|---|
| 509 | break; | 
|---|
| 510 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K: | 
|---|
| 511 | case USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K: | 
|---|
| 512 | table = apple_fn_keys; | 
|---|
| 513 | break; | 
|---|
| 514 | default: | 
|---|
| 515 | if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && | 
|---|
| 516 | hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) | 
|---|
| 517 | table = macbookair_fn_keys; | 
|---|
| 518 | else if (hid->product < 0x21d || hid->product >= 0x300) | 
|---|
| 519 | table = powerbook_fn_keys; | 
|---|
| 520 | else | 
|---|
| 521 | table = apple_fn_keys; | 
|---|
| 522 | } | 
|---|
| 523 |  | 
|---|
| 524 | trans = apple_find_translation(table, from: code); | 
|---|
| 525 |  | 
|---|
| 526 | if (trans) { | 
|---|
| 527 | bool from_is_set = test_bit(trans->from, input->key); | 
|---|
| 528 | bool to_is_set = test_bit(trans->to, input->key); | 
|---|
| 529 |  | 
|---|
| 530 | if (from_is_set) | 
|---|
| 531 | code = trans->from; | 
|---|
| 532 | else if (to_is_set) | 
|---|
| 533 | code = trans->to; | 
|---|
| 534 |  | 
|---|
| 535 | if (!(from_is_set || to_is_set)) { | 
|---|
| 536 | if (trans->flags & APPLE_FLAG_FKEY) { | 
|---|
| 537 | switch (real_fnmode) { | 
|---|
| 538 | case 1: | 
|---|
| 539 | do_translate = !asc->fn_on; | 
|---|
| 540 | break; | 
|---|
| 541 | case 2: | 
|---|
| 542 | do_translate = asc->fn_on; | 
|---|
| 543 | break; | 
|---|
| 544 | default: | 
|---|
| 545 | /* case 4 */ | 
|---|
| 546 | do_translate = false; | 
|---|
| 547 | } | 
|---|
| 548 | } else if (trans->flags & APPLE_FLAG_TB_FKEY) { | 
|---|
| 549 | switch (real_fnmode) { | 
|---|
| 550 | case 4: | 
|---|
| 551 | do_translate = false; | 
|---|
| 552 | break; | 
|---|
| 553 | default: | 
|---|
| 554 | do_translate = asc->fn_on; | 
|---|
| 555 | } | 
|---|
| 556 | } else { | 
|---|
| 557 | do_translate = asc->fn_on; | 
|---|
| 558 | } | 
|---|
| 559 |  | 
|---|
| 560 | if (do_translate) | 
|---|
| 561 | code = trans->to; | 
|---|
| 562 | } | 
|---|
| 563 | } | 
|---|
| 564 |  | 
|---|
| 565 | if (asc->quirks & APPLE_NUMLOCK_EMULATION && | 
|---|
| 566 | (test_bit(code, asc->pressed_numlock) || | 
|---|
| 567 | test_bit(LED_NUML, input->led))) { | 
|---|
| 568 | trans = apple_find_translation(table: powerbook_numlock_keys, from: code); | 
|---|
| 569 |  | 
|---|
| 570 | if (trans) { | 
|---|
| 571 | if (value) | 
|---|
| 572 | set_bit(nr: code, addr: asc->pressed_numlock); | 
|---|
| 573 | else | 
|---|
| 574 | clear_bit(nr: code, addr: asc->pressed_numlock); | 
|---|
| 575 |  | 
|---|
| 576 | code = trans->to; | 
|---|
| 577 | } | 
|---|
| 578 | } | 
|---|
| 579 | } | 
|---|
| 580 |  | 
|---|
| 581 | if (usage->code != code) { | 
|---|
| 582 | input_event_with_scancode(input, type: usage->type, code, hid: usage->hid, value); | 
|---|
| 583 |  | 
|---|
| 584 | return 1; | 
|---|
| 585 | } | 
|---|
| 586 |  | 
|---|
| 587 | return 0; | 
|---|
| 588 | } | 
|---|
| 589 |  | 
|---|
| 590 | static int apple_event(struct hid_device *hdev, struct hid_field *field, | 
|---|
| 591 | struct hid_usage *usage, __s32 value) | 
|---|
| 592 | { | 
|---|
| 593 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 594 |  | 
|---|
| 595 | if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput || | 
|---|
| 596 | !usage->type) | 
|---|
| 597 | return 0; | 
|---|
| 598 |  | 
|---|
| 599 | if ((asc->quirks & APPLE_INVERT_HWHEEL) && | 
|---|
| 600 | usage->code == REL_HWHEEL) { | 
|---|
| 601 | input_event_with_scancode(input: field->hidinput->input, type: usage->type, | 
|---|
| 602 | code: usage->code, hid: usage->hid, value: -value); | 
|---|
| 603 | return 1; | 
|---|
| 604 | } | 
|---|
| 605 |  | 
|---|
| 606 | if ((asc->quirks & APPLE_HAS_FN) && | 
|---|
| 607 | hidinput_apple_event(hid: hdev, input: field->hidinput->input, | 
|---|
| 608 | usage, value)) | 
|---|
| 609 | return 1; | 
|---|
| 610 |  | 
|---|
| 611 |  | 
|---|
| 612 | return 0; | 
|---|
| 613 | } | 
|---|
| 614 |  | 
|---|
| 615 | static int apple_fetch_battery(struct hid_device *hdev) | 
|---|
| 616 | { | 
|---|
| 617 | #ifdef CONFIG_HID_BATTERY_STRENGTH | 
|---|
| 618 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 619 | struct hid_report_enum *report_enum; | 
|---|
| 620 | struct hid_report *report; | 
|---|
| 621 |  | 
|---|
| 622 | if (!(asc->quirks & APPLE_RDESC_BATTERY) || !hdev->battery) | 
|---|
| 623 | return -1; | 
|---|
| 624 |  | 
|---|
| 625 | report_enum = &hdev->report_enum[hdev->battery_report_type]; | 
|---|
| 626 | report = report_enum->report_id_hash[hdev->battery_report_id]; | 
|---|
| 627 |  | 
|---|
| 628 | if (!report || report->maxfield < 1) | 
|---|
| 629 | return -1; | 
|---|
| 630 |  | 
|---|
| 631 | if (hdev->battery_capacity == hdev->battery_max) | 
|---|
| 632 | return -1; | 
|---|
| 633 |  | 
|---|
| 634 | hid_hw_request(hdev, report, HID_REQ_GET_REPORT); | 
|---|
| 635 | return 0; | 
|---|
| 636 | #else | 
|---|
| 637 | return -1; | 
|---|
| 638 | #endif | 
|---|
| 639 | } | 
|---|
| 640 |  | 
|---|
| 641 | static void apple_battery_timer_tick(struct timer_list *t) | 
|---|
| 642 | { | 
|---|
| 643 | struct apple_sc *asc = timer_container_of(asc, t, battery_timer); | 
|---|
| 644 | struct hid_device *hdev = asc->hdev; | 
|---|
| 645 |  | 
|---|
| 646 | if (apple_fetch_battery(hdev) == 0) { | 
|---|
| 647 | mod_timer(timer: &asc->battery_timer, | 
|---|
| 648 | expires: jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC)); | 
|---|
| 649 | } | 
|---|
| 650 | } | 
|---|
| 651 |  | 
|---|
| 652 | /* | 
|---|
| 653 | * MacBook JIS keyboard has wrong logical maximum | 
|---|
| 654 | * Magic Keyboard JIS has wrong logical maximum | 
|---|
| 655 | */ | 
|---|
| 656 | static const __u8 *apple_report_fixup(struct hid_device *hdev, __u8 *rdesc, | 
|---|
| 657 | unsigned int *rsize) | 
|---|
| 658 | { | 
|---|
| 659 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 660 |  | 
|---|
| 661 | if(*rsize >=71 && rdesc[70] == 0x65 && rdesc[64] == 0x65) { | 
|---|
| 662 | hid_info(hdev, | 
|---|
| 663 | "fixing up Magic Keyboard JIS report descriptor\n"); | 
|---|
| 664 | rdesc[64] = rdesc[70] = 0xe7; | 
|---|
| 665 | } | 
|---|
| 666 |  | 
|---|
| 667 | if ((asc->quirks & APPLE_RDESC_JIS) && *rsize >= 60 && | 
|---|
| 668 | rdesc[53] == 0x65 && rdesc[59] == 0x65) { | 
|---|
| 669 | hid_info(hdev, | 
|---|
| 670 | "fixing up MacBook JIS keyboard report descriptor\n"); | 
|---|
| 671 | rdesc[53] = rdesc[59] = 0xe7; | 
|---|
| 672 | } | 
|---|
| 673 |  | 
|---|
| 674 | /* | 
|---|
| 675 | * Change the usage from: | 
|---|
| 676 | *   0x06, 0x00, 0xff, // Usage Page (Vendor Defined Page 1)  0 | 
|---|
| 677 | *   0x09, 0x0b,       // Usage (Vendor Usage 0x0b)           3 | 
|---|
| 678 | * To: | 
|---|
| 679 | *   0x05, 0x01,       // Usage Page (Generic Desktop)        0 | 
|---|
| 680 | *   0x09, 0x06,       // Usage (Keyboard)                    2 | 
|---|
| 681 | */ | 
|---|
| 682 | if ((asc->quirks & APPLE_RDESC_BATTERY) && *rsize == 83 && | 
|---|
| 683 | rdesc[46] == 0x84 && rdesc[58] == 0x85) { | 
|---|
| 684 | hid_info(hdev, | 
|---|
| 685 | "fixing up Magic Keyboard battery report descriptor\n"); | 
|---|
| 686 | *rsize = *rsize - 1; | 
|---|
| 687 | rdesc = kmemdup(rdesc + 1, *rsize, GFP_KERNEL); | 
|---|
| 688 | if (!rdesc) | 
|---|
| 689 | return NULL; | 
|---|
| 690 |  | 
|---|
| 691 | rdesc[0] = 0x05; | 
|---|
| 692 | rdesc[1] = 0x01; | 
|---|
| 693 | rdesc[2] = 0x09; | 
|---|
| 694 | rdesc[3] = 0x06; | 
|---|
| 695 | } | 
|---|
| 696 |  | 
|---|
| 697 | return rdesc; | 
|---|
| 698 | } | 
|---|
| 699 |  | 
|---|
| 700 | static void apple_setup_input(struct input_dev *input) | 
|---|
| 701 | { | 
|---|
| 702 | set_bit(KEY_NUMLOCK, addr: input->keybit); | 
|---|
| 703 |  | 
|---|
| 704 | /* Enable all needed keys */ | 
|---|
| 705 | apple_setup_key_translation(input, table: apple_fn_keys); | 
|---|
| 706 | apple_setup_key_translation(input, table: powerbook_fn_keys); | 
|---|
| 707 | apple_setup_key_translation(input, table: powerbook_numlock_keys); | 
|---|
| 708 | apple_setup_key_translation(input, table: apple_iso_keyboard); | 
|---|
| 709 | apple_setup_key_translation(input, table: magic_keyboard_alu_fn_keys); | 
|---|
| 710 | apple_setup_key_translation(input, table: magic_keyboard_2015_fn_keys); | 
|---|
| 711 | apple_setup_key_translation(input, table: magic_keyboard_2021_and_2024_fn_keys); | 
|---|
| 712 | apple_setup_key_translation(input, table: macbookpro_no_esc_fn_keys); | 
|---|
| 713 | apple_setup_key_translation(input, table: macbookpro_dedicated_esc_fn_keys); | 
|---|
| 714 | } | 
|---|
| 715 |  | 
|---|
| 716 | static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi, | 
|---|
| 717 | struct hid_field *field, struct hid_usage *usage, | 
|---|
| 718 | unsigned long **bit, int *max) | 
|---|
| 719 | { | 
|---|
| 720 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 721 |  | 
|---|
| 722 | if (usage->hid == (HID_UP_CUSTOM | 0x0003) || | 
|---|
| 723 | usage->hid == (HID_UP_MSVENDOR | 0x0003) || | 
|---|
| 724 | usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) { | 
|---|
| 725 | /* The fn key on Apple USB keyboards */ | 
|---|
| 726 | set_bit(EV_REP, addr: hi->input->evbit); | 
|---|
| 727 | hid_map_usage_clear(hidinput: hi, usage, bit, max, EV_KEY, KEY_FN); | 
|---|
| 728 | asc->fn_found = true; | 
|---|
| 729 | apple_setup_input(input: hi->input); | 
|---|
| 730 | return 1; | 
|---|
| 731 | } | 
|---|
| 732 |  | 
|---|
| 733 | /* we want the hid layer to go through standard path (set and ignore) */ | 
|---|
| 734 | return 0; | 
|---|
| 735 | } | 
|---|
| 736 |  | 
|---|
| 737 | static int apple_input_mapped(struct hid_device *hdev, struct hid_input *hi, | 
|---|
| 738 | struct hid_field *field, struct hid_usage *usage, | 
|---|
| 739 | unsigned long **bit, int *max) | 
|---|
| 740 | { | 
|---|
| 741 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 742 |  | 
|---|
| 743 | if (asc->quirks & APPLE_MIGHTYMOUSE) { | 
|---|
| 744 | if (usage->hid == HID_GD_Z) | 
|---|
| 745 | hid_map_usage(hidinput: hi, usage, bit, max, EV_REL, REL_HWHEEL); | 
|---|
| 746 | else if (usage->code == BTN_1) | 
|---|
| 747 | hid_map_usage(hidinput: hi, usage, bit, max, EV_KEY, BTN_2); | 
|---|
| 748 | else if (usage->code == BTN_2) | 
|---|
| 749 | hid_map_usage(hidinput: hi, usage, bit, max, EV_KEY, BTN_1); | 
|---|
| 750 | } | 
|---|
| 751 |  | 
|---|
| 752 | return 0; | 
|---|
| 753 | } | 
|---|
| 754 |  | 
|---|
| 755 | static int apple_input_configured(struct hid_device *hdev, | 
|---|
| 756 | struct hid_input *hidinput) | 
|---|
| 757 | { | 
|---|
| 758 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 759 |  | 
|---|
| 760 | if (((asc->quirks & APPLE_HAS_FN) && !asc->fn_found) || apple_is_omoton_kb066(hdev)) { | 
|---|
| 761 | hid_info(hdev, "Fn key not found (Apple Wireless Keyboard clone?), disabling Fn key handling\n"); | 
|---|
| 762 | asc->quirks &= ~APPLE_HAS_FN; | 
|---|
| 763 | } | 
|---|
| 764 |  | 
|---|
| 765 | if (apple_is_non_apple_keyboard(hdev)) { | 
|---|
| 766 | hid_info(hdev, "Non-apple keyboard detected; function keys will default to fnmode=2 behavior\n"); | 
|---|
| 767 | asc->quirks |= APPLE_IS_NON_APPLE; | 
|---|
| 768 | } | 
|---|
| 769 |  | 
|---|
| 770 | return 0; | 
|---|
| 771 | } | 
|---|
| 772 |  | 
|---|
| 773 | static bool apple_backlight_check_support(struct hid_device *hdev) | 
|---|
| 774 | { | 
|---|
| 775 | int i; | 
|---|
| 776 | unsigned int hid; | 
|---|
| 777 | struct hid_report *report; | 
|---|
| 778 |  | 
|---|
| 779 | list_for_each_entry(report, &hdev->report_enum[HID_INPUT_REPORT].report_list, list) { | 
|---|
| 780 | for (i = 0; i < report->maxfield; i++) { | 
|---|
| 781 | hid = report->field[i]->usage->hid; | 
|---|
| 782 | if ((hid & HID_USAGE_PAGE) == HID_UP_MSVENDOR && (hid & HID_USAGE) == 0xf) | 
|---|
| 783 | return true; | 
|---|
| 784 | } | 
|---|
| 785 | } | 
|---|
| 786 |  | 
|---|
| 787 | return false; | 
|---|
| 788 | } | 
|---|
| 789 |  | 
|---|
| 790 | static int apple_backlight_set(struct hid_device *hdev, u16 value, u16 rate) | 
|---|
| 791 | { | 
|---|
| 792 | int ret = 0; | 
|---|
| 793 | struct apple_backlight_set_report *rep; | 
|---|
| 794 |  | 
|---|
| 795 | rep = kmalloc(sizeof(*rep), GFP_KERNEL); | 
|---|
| 796 | if (rep == NULL) | 
|---|
| 797 | return -ENOMEM; | 
|---|
| 798 |  | 
|---|
| 799 | rep->report_id = 0xB0; | 
|---|
| 800 | rep->version = 1; | 
|---|
| 801 | rep->backlight = value; | 
|---|
| 802 | rep->rate = rate; | 
|---|
| 803 |  | 
|---|
| 804 | ret = hid_hw_raw_request(hdev, reportnum: 0xB0u, buf: (u8 *) rep, len: sizeof(*rep), | 
|---|
| 805 | rtype: HID_OUTPUT_REPORT, reqtype: HID_REQ_SET_REPORT); | 
|---|
| 806 |  | 
|---|
| 807 | kfree(objp: rep); | 
|---|
| 808 | return ret; | 
|---|
| 809 | } | 
|---|
| 810 |  | 
|---|
| 811 | static int apple_backlight_led_set(struct led_classdev *led_cdev, | 
|---|
| 812 | enum led_brightness brightness) | 
|---|
| 813 | { | 
|---|
| 814 | struct apple_sc_backlight *backlight = container_of(led_cdev, | 
|---|
| 815 | struct apple_sc_backlight, cdev); | 
|---|
| 816 |  | 
|---|
| 817 | return apple_backlight_set(hdev: backlight->hdev, value: brightness, rate: 0); | 
|---|
| 818 | } | 
|---|
| 819 |  | 
|---|
| 820 | static int apple_backlight_init(struct hid_device *hdev) | 
|---|
| 821 | { | 
|---|
| 822 | int ret; | 
|---|
| 823 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 824 | struct apple_backlight_config_report *rep; | 
|---|
| 825 |  | 
|---|
| 826 | if (!apple_backlight_check_support(hdev)) | 
|---|
| 827 | return -EINVAL; | 
|---|
| 828 |  | 
|---|
| 829 | rep = kmalloc(0x200, GFP_KERNEL); | 
|---|
| 830 | if (rep == NULL) | 
|---|
| 831 | return -ENOMEM; | 
|---|
| 832 |  | 
|---|
| 833 | ret = hid_hw_raw_request(hdev, reportnum: 0xBFu, buf: (u8 *) rep, len: sizeof(*rep), | 
|---|
| 834 | rtype: HID_FEATURE_REPORT, reqtype: HID_REQ_GET_REPORT); | 
|---|
| 835 | if (ret < 0) { | 
|---|
| 836 | hid_err(hdev, "backlight request failed: %d\n", ret); | 
|---|
| 837 | goto cleanup_and_exit; | 
|---|
| 838 | } | 
|---|
| 839 | if (ret < 8 || rep->version != 1) { | 
|---|
| 840 | hid_err(hdev, "backlight config struct: bad version %i\n", rep->version); | 
|---|
| 841 | ret = -EINVAL; | 
|---|
| 842 | goto cleanup_and_exit; | 
|---|
| 843 | } | 
|---|
| 844 |  | 
|---|
| 845 | hid_dbg(hdev, "backlight config: off=%u, on_min=%u, on_max=%u\n", | 
|---|
| 846 | rep->backlight_off, rep->backlight_on_min, rep->backlight_on_max); | 
|---|
| 847 |  | 
|---|
| 848 | asc->backlight = devm_kzalloc(dev: &hdev->dev, size: sizeof(*asc->backlight), GFP_KERNEL); | 
|---|
| 849 | if (!asc->backlight) { | 
|---|
| 850 | ret = -ENOMEM; | 
|---|
| 851 | goto cleanup_and_exit; | 
|---|
| 852 | } | 
|---|
| 853 |  | 
|---|
| 854 | asc->backlight->hdev = hdev; | 
|---|
| 855 | asc->backlight->cdev.name = "apple::kbd_backlight"; | 
|---|
| 856 | asc->backlight->cdev.max_brightness = rep->backlight_on_max; | 
|---|
| 857 | asc->backlight->cdev.brightness_set_blocking = apple_backlight_led_set; | 
|---|
| 858 |  | 
|---|
| 859 | ret = apple_backlight_set(hdev, value: 0, rate: 0); | 
|---|
| 860 | if (ret < 0) { | 
|---|
| 861 | hid_err(hdev, "backlight set request failed: %d\n", ret); | 
|---|
| 862 | goto cleanup_and_exit; | 
|---|
| 863 | } | 
|---|
| 864 |  | 
|---|
| 865 | ret = devm_led_classdev_register(parent: &hdev->dev, led_cdev: &asc->backlight->cdev); | 
|---|
| 866 |  | 
|---|
| 867 | cleanup_and_exit: | 
|---|
| 868 | kfree(objp: rep); | 
|---|
| 869 | return ret; | 
|---|
| 870 | } | 
|---|
| 871 |  | 
|---|
| 872 | static void apple_magic_backlight_report_set(struct hid_report *rep, s32 value, u8 rate) | 
|---|
| 873 | { | 
|---|
| 874 | rep->field[0]->value[0] = value; | 
|---|
| 875 | rep->field[1]->value[0] = 0x5e; /* Mimic Windows */ | 
|---|
| 876 | rep->field[1]->value[0] |= rate << 8; | 
|---|
| 877 |  | 
|---|
| 878 | hid_hw_request(hdev: rep->device, report: rep, reqtype: HID_REQ_SET_REPORT); | 
|---|
| 879 | } | 
|---|
| 880 |  | 
|---|
| 881 | static void apple_magic_backlight_set(struct apple_magic_backlight *backlight, | 
|---|
| 882 | int brightness, char rate) | 
|---|
| 883 | { | 
|---|
| 884 | apple_magic_backlight_report_set(rep: backlight->power, value: brightness ? 1 : 0, rate); | 
|---|
| 885 | if (brightness) | 
|---|
| 886 | apple_magic_backlight_report_set(rep: backlight->brightness, value: brightness, rate); | 
|---|
| 887 | } | 
|---|
| 888 |  | 
|---|
| 889 | static int apple_magic_backlight_led_set(struct led_classdev *led_cdev, | 
|---|
| 890 | enum led_brightness brightness) | 
|---|
| 891 | { | 
|---|
| 892 | struct apple_magic_backlight *backlight = container_of(led_cdev, | 
|---|
| 893 | struct apple_magic_backlight, cdev); | 
|---|
| 894 |  | 
|---|
| 895 | apple_magic_backlight_set(backlight, brightness, rate: 1); | 
|---|
| 896 | return 0; | 
|---|
| 897 | } | 
|---|
| 898 |  | 
|---|
| 899 | static int apple_magic_backlight_init(struct hid_device *hdev) | 
|---|
| 900 | { | 
|---|
| 901 | struct apple_magic_backlight *backlight; | 
|---|
| 902 | struct hid_report_enum *report_enum; | 
|---|
| 903 |  | 
|---|
| 904 | /* | 
|---|
| 905 | * Ensure this usb endpoint is for the keyboard backlight, not touchbar | 
|---|
| 906 | * backlight. | 
|---|
| 907 | */ | 
|---|
| 908 | if (hdev->collection[0].usage != HID_USAGE_MAGIC_BL) | 
|---|
| 909 | return -ENODEV; | 
|---|
| 910 |  | 
|---|
| 911 | backlight = devm_kzalloc(dev: &hdev->dev, size: sizeof(*backlight), GFP_KERNEL); | 
|---|
| 912 | if (!backlight) | 
|---|
| 913 | return -ENOMEM; | 
|---|
| 914 |  | 
|---|
| 915 | report_enum = &hdev->report_enum[HID_FEATURE_REPORT]; | 
|---|
| 916 | backlight->brightness = report_enum->report_id_hash[APPLE_MAGIC_REPORT_ID_BRIGHTNESS]; | 
|---|
| 917 | backlight->power = report_enum->report_id_hash[APPLE_MAGIC_REPORT_ID_POWER]; | 
|---|
| 918 |  | 
|---|
| 919 | if (!backlight->brightness || backlight->brightness->maxfield < 2 || | 
|---|
| 920 | !backlight->power || backlight->power->maxfield < 2) | 
|---|
| 921 | return -ENODEV; | 
|---|
| 922 |  | 
|---|
| 923 | backlight->cdev.name = ":white:"LED_FUNCTION_KBD_BACKLIGHT; | 
|---|
| 924 | backlight->cdev.max_brightness = backlight->brightness->field[0]->logical_maximum; | 
|---|
| 925 | backlight->cdev.brightness_set_blocking = apple_magic_backlight_led_set; | 
|---|
| 926 |  | 
|---|
| 927 | apple_magic_backlight_set(backlight, brightness: 0, rate: 0); | 
|---|
| 928 |  | 
|---|
| 929 | return devm_led_classdev_register(parent: &hdev->dev, led_cdev: &backlight->cdev); | 
|---|
| 930 |  | 
|---|
| 931 | } | 
|---|
| 932 |  | 
|---|
| 933 | static int apple_probe(struct hid_device *hdev, | 
|---|
| 934 | const struct hid_device_id *id) | 
|---|
| 935 | { | 
|---|
| 936 | unsigned long quirks = id->driver_data; | 
|---|
| 937 | struct apple_sc *asc; | 
|---|
| 938 | int ret; | 
|---|
| 939 |  | 
|---|
| 940 | asc = devm_kzalloc(dev: &hdev->dev, size: sizeof(*asc), GFP_KERNEL); | 
|---|
| 941 | if (asc == NULL) { | 
|---|
| 942 | hid_err(hdev, "can't alloc apple descriptor\n"); | 
|---|
| 943 | return -ENOMEM; | 
|---|
| 944 | } | 
|---|
| 945 |  | 
|---|
| 946 | asc->hdev = hdev; | 
|---|
| 947 | asc->quirks = quirks; | 
|---|
| 948 |  | 
|---|
| 949 | hid_set_drvdata(hdev, data: asc); | 
|---|
| 950 |  | 
|---|
| 951 | ret = hid_parse(hdev); | 
|---|
| 952 | if (ret) { | 
|---|
| 953 | hid_err(hdev, "parse failed\n"); | 
|---|
| 954 | return ret; | 
|---|
| 955 | } | 
|---|
| 956 |  | 
|---|
| 957 | ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); | 
|---|
| 958 | if (ret) { | 
|---|
| 959 | hid_err(hdev, "hw start failed\n"); | 
|---|
| 960 | return ret; | 
|---|
| 961 | } | 
|---|
| 962 |  | 
|---|
| 963 | if (quirks & APPLE_RDESC_BATTERY) { | 
|---|
| 964 | timer_setup(&asc->battery_timer, apple_battery_timer_tick, 0); | 
|---|
| 965 | mod_timer(timer: &asc->battery_timer, | 
|---|
| 966 | expires: jiffies + secs_to_jiffies(APPLE_BATTERY_TIMEOUT_SEC)); | 
|---|
| 967 | apple_fetch_battery(hdev); | 
|---|
| 968 | } | 
|---|
| 969 |  | 
|---|
| 970 | if (quirks & APPLE_BACKLIGHT_CTL) | 
|---|
| 971 | apple_backlight_init(hdev); | 
|---|
| 972 |  | 
|---|
| 973 | if (quirks & APPLE_MAGIC_BACKLIGHT) { | 
|---|
| 974 | ret = apple_magic_backlight_init(hdev); | 
|---|
| 975 | if (ret) | 
|---|
| 976 | goto out_err; | 
|---|
| 977 | } | 
|---|
| 978 |  | 
|---|
| 979 | return 0; | 
|---|
| 980 |  | 
|---|
| 981 | out_err: | 
|---|
| 982 | if (quirks & APPLE_RDESC_BATTERY) | 
|---|
| 983 | timer_delete_sync(timer: &asc->battery_timer); | 
|---|
| 984 |  | 
|---|
| 985 | hid_hw_stop(hdev); | 
|---|
| 986 | return ret; | 
|---|
| 987 | } | 
|---|
| 988 |  | 
|---|
| 989 | static void apple_remove(struct hid_device *hdev) | 
|---|
| 990 | { | 
|---|
| 991 | struct apple_sc *asc = hid_get_drvdata(hdev); | 
|---|
| 992 |  | 
|---|
| 993 | if (asc->quirks & APPLE_RDESC_BATTERY) | 
|---|
| 994 | timer_delete_sync(timer: &asc->battery_timer); | 
|---|
| 995 |  | 
|---|
| 996 | hid_hw_stop(hdev); | 
|---|
| 997 | } | 
|---|
| 998 |  | 
|---|
| 999 | static const struct hid_device_id apple_devices[] = { | 
|---|
| 1000 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE), | 
|---|
| 1001 | .driver_data = APPLE_MIGHTYMOUSE | APPLE_INVERT_HWHEEL }, | 
|---|
| 1002 |  | 
|---|
| 1003 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI), | 
|---|
| 1004 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1005 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO), | 
|---|
| 1006 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1007 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI), | 
|---|
| 1008 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1009 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO), | 
|---|
| 1010 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1011 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS), | 
|---|
| 1012 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1013 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI), | 
|---|
| 1014 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1015 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO), | 
|---|
| 1016 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1017 | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1018 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS), | 
|---|
| 1019 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1020 | APPLE_RDESC_JIS }, | 
|---|
| 1021 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI), | 
|---|
| 1022 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1023 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO), | 
|---|
| 1024 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1025 | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1026 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS), | 
|---|
| 1027 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1028 | APPLE_RDESC_JIS }, | 
|---|
| 1029 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI), | 
|---|
| 1030 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1031 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO), | 
|---|
| 1032 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1033 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS), | 
|---|
| 1034 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1035 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI), | 
|---|
| 1036 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1037 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO), | 
|---|
| 1038 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1039 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS), | 
|---|
| 1040 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1041 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI), | 
|---|
| 1042 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1043 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO), | 
|---|
| 1044 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1045 | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1046 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS), | 
|---|
| 1047 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1048 | APPLE_RDESC_JIS }, | 
|---|
| 1049 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), | 
|---|
| 1050 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1051 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI), | 
|---|
| 1052 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1053 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO), | 
|---|
| 1054 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1055 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO), | 
|---|
| 1056 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1057 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS), | 
|---|
| 1058 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1059 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI), | 
|---|
| 1060 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1061 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO), | 
|---|
| 1062 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1063 | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1064 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO), | 
|---|
| 1065 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1066 | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1067 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, | 
|---|
| 1068 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI), | 
|---|
| 1069 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1070 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, | 
|---|
| 1071 | USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_JIS), | 
|---|
| 1072 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1073 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS), | 
|---|
| 1074 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1075 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015), | 
|---|
| 1076 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1077 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2015), | 
|---|
| 1078 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1079 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015), | 
|---|
| 1080 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1081 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2015), | 
|---|
| 1082 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1083 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | 
|---|
| 1084 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1085 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO), | 
|---|
| 1086 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1087 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS), | 
|---|
| 1088 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1089 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), | 
|---|
| 1090 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1091 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), | 
|---|
| 1092 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1093 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), | 
|---|
| 1094 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1095 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), | 
|---|
| 1096 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1097 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), | 
|---|
| 1098 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1099 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), | 
|---|
| 1100 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1101 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI), | 
|---|
| 1102 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1103 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO), | 
|---|
| 1104 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1105 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS), | 
|---|
| 1106 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1107 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI), | 
|---|
| 1108 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1109 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO), | 
|---|
| 1110 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1111 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS), | 
|---|
| 1112 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1113 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI), | 
|---|
| 1114 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1115 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO), | 
|---|
| 1116 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1117 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), | 
|---|
| 1118 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1119 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI), | 
|---|
| 1120 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1121 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO), | 
|---|
| 1122 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1123 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS), | 
|---|
| 1124 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1125 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), | 
|---|
| 1126 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1127 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), | 
|---|
| 1128 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1129 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS), | 
|---|
| 1130 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1131 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), | 
|---|
| 1132 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1133 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), | 
|---|
| 1134 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1135 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), | 
|---|
| 1136 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1137 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), | 
|---|
| 1138 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1139 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), | 
|---|
| 1140 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1141 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), | 
|---|
| 1142 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1143 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI), | 
|---|
| 1144 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1145 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO), | 
|---|
| 1146 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1147 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS), | 
|---|
| 1148 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1149 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI), | 
|---|
| 1150 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1151 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO), | 
|---|
| 1152 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1153 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS), | 
|---|
| 1154 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1155 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ANSI), | 
|---|
| 1156 | .driver_data = APPLE_HAS_FN }, | 
|---|
| 1157 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_ISO), | 
|---|
| 1158 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1159 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING9_JIS), | 
|---|
| 1160 | .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS }, | 
|---|
| 1161 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K), | 
|---|
| 1162 | .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1163 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132), | 
|---|
| 1164 | .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK | | 
|---|
| 1165 | APPLE_DISABLE_FKEYS }, | 
|---|
| 1166 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680), | 
|---|
| 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_ALT), | 
|---|
| 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_J213), | 
|---|
| 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_J214K), | 
|---|
| 1176 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS }, | 
|---|
| 1177 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223), | 
|---|
| 1178 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS }, | 
|---|
| 1179 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K), | 
|---|
| 1180 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1181 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F), | 
|---|
| 1182 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS }, | 
|---|
| 1183 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI), | 
|---|
| 1184 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1185 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO), | 
|---|
| 1186 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN | | 
|---|
| 1187 | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1188 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS), | 
|---|
| 1189 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1190 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY), | 
|---|
| 1191 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1192 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY), | 
|---|
| 1193 | .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN }, | 
|---|
| 1194 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021), | 
|---|
| 1195 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1196 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021), | 
|---|
| 1197 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1198 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021), | 
|---|
| 1199 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1200 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021), | 
|---|
| 1201 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1202 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021), | 
|---|
| 1203 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1204 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021), | 
|---|
| 1205 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1206 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024), | 
|---|
| 1207 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1208 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2024), | 
|---|
| 1209 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1210 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2024), | 
|---|
| 1211 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1212 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2024), | 
|---|
| 1213 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1214 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2024), | 
|---|
| 1215 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, | 
|---|
| 1216 | { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2024), | 
|---|
| 1217 | .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, | 
|---|
| 1218 | { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_TOUCHBAR_BACKLIGHT), | 
|---|
| 1219 | .driver_data = APPLE_MAGIC_BACKLIGHT }, | 
|---|
| 1220 |  | 
|---|
| 1221 | { } | 
|---|
| 1222 | }; | 
|---|
| 1223 | MODULE_DEVICE_TABLE(hid, apple_devices); | 
|---|
| 1224 |  | 
|---|
| 1225 | static struct hid_driver apple_driver = { | 
|---|
| 1226 | .name = "apple", | 
|---|
| 1227 | .id_table = apple_devices, | 
|---|
| 1228 | .report_fixup = apple_report_fixup, | 
|---|
| 1229 | .probe = apple_probe, | 
|---|
| 1230 | .remove = apple_remove, | 
|---|
| 1231 | .event = apple_event, | 
|---|
| 1232 | .input_mapping = apple_input_mapping, | 
|---|
| 1233 | .input_mapped = apple_input_mapped, | 
|---|
| 1234 | .input_configured = apple_input_configured, | 
|---|
| 1235 | }; | 
|---|
| 1236 | module_hid_driver(apple_driver); | 
|---|
| 1237 |  | 
|---|
| 1238 | MODULE_DESCRIPTION( "Apple USB HID quirks support for Linux"); | 
|---|
| 1239 | MODULE_LICENSE( "GPL"); | 
|---|
| 1240 |  | 
|---|