Skip to content

Commit a23ff60

Browse files
AdityaGarg8Jiri Kosina
authored andcommitted
HID: apple: add fnmode=4 to disable translation of fkeys and make it default on Macs with Touch Bar
The kernel now has a dedicated driver for Touch Bar on Macs. Since function keys can now be accessed via the Touch Bar, emulating them using non standard ways like Fn+1=F1 should be avoided. This patch adds an fnmode=4 which ignores only the Function key translation, and is enabled by default on MacBook Pros with a Touch Bar. Signed-off-by: Aditya Garg <[email protected]> Signed-off-by: Jiri Kosina <[email protected]>
1 parent 4604baa commit a23ff60

File tree

1 file changed

+54
-36
lines changed

1 file changed

+54
-36
lines changed

drivers/hid/hid-apple.c

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@
4242
#define APPLE_BACKLIGHT_CTL BIT(10)
4343
#define APPLE_IS_NON_APPLE BIT(11)
4444
#define APPLE_MAGIC_BACKLIGHT BIT(12)
45+
#define APPLE_DISABLE_FKEYS BIT(13)
4546

46-
#define APPLE_FLAG_FKEY 0x01
47+
#define APPLE_FLAG_FKEY BIT(0)
48+
#define APPLE_FLAG_TB_FKEY BIT(1)
4749

4850
#define HID_COUNTRY_INTERNATIONAL_ISO 13
4951
#define APPLE_BATTERY_TIMEOUT_MS 60000
@@ -55,7 +57,7 @@
5557
static unsigned int fnmode = 3;
5658
module_param(fnmode, uint, 0644);
5759
MODULE_PARM_DESC(fnmode, "Mode of fn key on Apple keyboards (0 = disabled, "
58-
"1 = fkeyslast, 2 = fkeysfirst, [3] = auto)");
60+
"1 = fkeyslast, 2 = fkeysfirst, [3] = auto, 4 = fkeysdisabled)");
5961

6062
static int iso_layout = -1;
6163
module_param(iso_layout, int, 0644);
@@ -121,7 +123,7 @@ struct apple_sc {
121123
struct apple_key_translation {
122124
u16 from;
123125
u16 to;
124-
u8 flags;
126+
unsigned long flags;
125127
};
126128

127129
static const struct apple_key_translation magic_keyboard_alu_fn_keys[] = {
@@ -211,19 +213,19 @@ static const struct apple_key_translation macbookair_fn_keys[] = {
211213
static const struct apple_key_translation macbookpro_no_esc_fn_keys[] = {
212214
{ KEY_BACKSPACE, KEY_DELETE },
213215
{ KEY_ENTER, KEY_INSERT },
214-
{ KEY_GRAVE, KEY_ESC },
215-
{ KEY_1, KEY_F1 },
216-
{ KEY_2, KEY_F2 },
217-
{ KEY_3, KEY_F3 },
218-
{ KEY_4, KEY_F4 },
219-
{ KEY_5, KEY_F5 },
220-
{ KEY_6, KEY_F6 },
221-
{ KEY_7, KEY_F7 },
222-
{ KEY_8, KEY_F8 },
223-
{ KEY_9, KEY_F9 },
224-
{ KEY_0, KEY_F10 },
225-
{ KEY_MINUS, KEY_F11 },
226-
{ KEY_EQUAL, KEY_F12 },
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 },
227229
{ KEY_UP, KEY_PAGEUP },
228230
{ KEY_DOWN, KEY_PAGEDOWN },
229231
{ KEY_LEFT, KEY_HOME },
@@ -234,18 +236,18 @@ static const struct apple_key_translation macbookpro_no_esc_fn_keys[] = {
234236
static const struct apple_key_translation macbookpro_dedicated_esc_fn_keys[] = {
235237
{ KEY_BACKSPACE, KEY_DELETE },
236238
{ KEY_ENTER, KEY_INSERT },
237-
{ KEY_1, KEY_F1 },
238-
{ KEY_2, KEY_F2 },
239-
{ KEY_3, KEY_F3 },
240-
{ KEY_4, KEY_F4 },
241-
{ KEY_5, KEY_F5 },
242-
{ KEY_6, KEY_F6 },
243-
{ KEY_7, KEY_F7 },
244-
{ KEY_8, KEY_F8 },
245-
{ KEY_9, KEY_F9 },
246-
{ KEY_0, KEY_F10 },
247-
{ KEY_MINUS, KEY_F11 },
248-
{ KEY_EQUAL, KEY_F12 },
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 },
249251
{ KEY_UP, KEY_PAGEUP },
250252
{ KEY_DOWN, KEY_PAGEDOWN },
251253
{ KEY_LEFT, KEY_HOME },
@@ -424,7 +426,12 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
424426
unsigned int real_fnmode;
425427

426428
if (fnmode == 3) {
427-
real_fnmode = (asc->quirks & APPLE_IS_NON_APPLE) ? 2 : 1;
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;
428435
} else {
429436
real_fnmode = fnmode;
430437
}
@@ -534,8 +541,16 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
534541
do_translate = asc->fn_on;
535542
break;
536543
default:
537-
/* should never happen */
544+
/* case 4 */
545+
do_translate = false;
546+
}
547+
} else if (trans->flags & APPLE_FLAG_TB_FKEY) {
548+
switch (real_fnmode) {
549+
case 4:
538550
do_translate = false;
551+
break;
552+
default:
553+
do_translate = asc->fn_on;
539554
}
540555
} else {
541556
do_translate = asc->fn_on;
@@ -1139,19 +1154,22 @@ static const struct hid_device_id apple_devices[] = {
11391154
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K),
11401155
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
11411156
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132),
1142-
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
1157+
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1158+
APPLE_DISABLE_FKEYS },
11431159
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680),
1144-
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
1160+
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1161+
APPLE_DISABLE_FKEYS },
11451162
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213),
1146-
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
1163+
.driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
1164+
APPLE_DISABLE_FKEYS },
11471165
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K),
1148-
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1166+
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
11491167
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223),
1150-
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1168+
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
11511169
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K),
11521170
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
11531171
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F),
1154-
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
1172+
.driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
11551173
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
11561174
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
11571175
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),

0 commit comments

Comments
 (0)