]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: apple: add fnmode=4 to disable translation of fkeys and make it default on Macs...
authorAditya Garg <gargaditya08@live.com>
Mon, 19 May 2025 12:16:21 +0000 (17:46 +0530)
committerJiri Kosina <jkosina@suse.com>
Tue, 10 Jun 2025 19:22:29 +0000 (21:22 +0200)
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 <gargaditya08@live.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-apple.c

index d9f13f610b285f6f50fb79da530013c8887bfc93..155d514fb4c593d8b2a251a0af01f3e4e3ed5df4 100644 (file)
 #define APPLE_BACKLIGHT_CTL    BIT(10)
 #define APPLE_IS_NON_APPLE     BIT(11)
 #define APPLE_MAGIC_BACKLIGHT  BIT(12)
+#define APPLE_DISABLE_FKEYS    BIT(13)
 
-#define APPLE_FLAG_FKEY                0x01
+#define APPLE_FLAG_FKEY                BIT(0)
+#define APPLE_FLAG_TB_FKEY     BIT(1)
 
 #define HID_COUNTRY_INTERNATIONAL_ISO  13
 #define APPLE_BATTERY_TIMEOUT_MS       60000
@@ -55,7 +57,7 @@
 static unsigned int fnmode = 3;
 module_param(fnmode, uint, 0644);
 MODULE_PARM_DESC(fnmode, "Mode of fn key on Apple keyboards (0 = disabled, "
-               "1 = fkeyslast, 2 = fkeysfirst, [3] = auto)");
+               "1 = fkeyslast, 2 = fkeysfirst, [3] = auto, 4 = fkeysdisabled)");
 
 static int iso_layout = -1;
 module_param(iso_layout, int, 0644);
@@ -121,7 +123,7 @@ struct apple_sc {
 struct apple_key_translation {
        u16 from;
        u16 to;
-       u8 flags;
+       unsigned long flags;
 };
 
 static const struct apple_key_translation magic_keyboard_alu_fn_keys[] = {
@@ -211,19 +213,19 @@ static const struct apple_key_translation macbookair_fn_keys[] = {
 static const struct apple_key_translation macbookpro_no_esc_fn_keys[] = {
        { KEY_BACKSPACE, KEY_DELETE },
        { KEY_ENTER,    KEY_INSERT },
-       { KEY_GRAVE,    KEY_ESC },
-       { KEY_1,        KEY_F1 },
-       { KEY_2,        KEY_F2 },
-       { KEY_3,        KEY_F3 },
-       { KEY_4,        KEY_F4 },
-       { KEY_5,        KEY_F5 },
-       { KEY_6,        KEY_F6 },
-       { KEY_7,        KEY_F7 },
-       { KEY_8,        KEY_F8 },
-       { KEY_9,        KEY_F9 },
-       { KEY_0,        KEY_F10 },
-       { KEY_MINUS,    KEY_F11 },
-       { KEY_EQUAL,    KEY_F12 },
+       { KEY_GRAVE,    KEY_ESC, APPLE_FLAG_TB_FKEY },
+       { KEY_1,        KEY_F1,  APPLE_FLAG_TB_FKEY },
+       { KEY_2,        KEY_F2,  APPLE_FLAG_TB_FKEY },
+       { KEY_3,        KEY_F3,  APPLE_FLAG_TB_FKEY },
+       { KEY_4,        KEY_F4,  APPLE_FLAG_TB_FKEY },
+       { KEY_5,        KEY_F5,  APPLE_FLAG_TB_FKEY },
+       { KEY_6,        KEY_F6,  APPLE_FLAG_TB_FKEY },
+       { KEY_7,        KEY_F7,  APPLE_FLAG_TB_FKEY },
+       { KEY_8,        KEY_F8,  APPLE_FLAG_TB_FKEY },
+       { KEY_9,        KEY_F9,  APPLE_FLAG_TB_FKEY },
+       { KEY_0,        KEY_F10, APPLE_FLAG_TB_FKEY },
+       { KEY_MINUS,    KEY_F11, APPLE_FLAG_TB_FKEY },
+       { KEY_EQUAL,    KEY_F12, APPLE_FLAG_TB_FKEY },
        { KEY_UP,       KEY_PAGEUP },
        { KEY_DOWN,     KEY_PAGEDOWN },
        { KEY_LEFT,     KEY_HOME },
@@ -234,18 +236,18 @@ static const struct apple_key_translation macbookpro_no_esc_fn_keys[] = {
 static const struct apple_key_translation macbookpro_dedicated_esc_fn_keys[] = {
        { KEY_BACKSPACE, KEY_DELETE },
        { KEY_ENTER,    KEY_INSERT },
-       { KEY_1,        KEY_F1 },
-       { KEY_2,        KEY_F2 },
-       { KEY_3,        KEY_F3 },
-       { KEY_4,        KEY_F4 },
-       { KEY_5,        KEY_F5 },
-       { KEY_6,        KEY_F6 },
-       { KEY_7,        KEY_F7 },
-       { KEY_8,        KEY_F8 },
-       { KEY_9,        KEY_F9 },
-       { KEY_0,        KEY_F10 },
-       { KEY_MINUS,    KEY_F11 },
-       { KEY_EQUAL,    KEY_F12 },
+       { KEY_1,        KEY_F1,  APPLE_FLAG_TB_FKEY },
+       { KEY_2,        KEY_F2,  APPLE_FLAG_TB_FKEY },
+       { KEY_3,        KEY_F3,  APPLE_FLAG_TB_FKEY },
+       { KEY_4,        KEY_F4,  APPLE_FLAG_TB_FKEY },
+       { KEY_5,        KEY_F5,  APPLE_FLAG_TB_FKEY },
+       { KEY_6,        KEY_F6,  APPLE_FLAG_TB_FKEY },
+       { KEY_7,        KEY_F7,  APPLE_FLAG_TB_FKEY },
+       { KEY_8,        KEY_F8,  APPLE_FLAG_TB_FKEY },
+       { KEY_9,        KEY_F9,  APPLE_FLAG_TB_FKEY },
+       { KEY_0,        KEY_F10, APPLE_FLAG_TB_FKEY },
+       { KEY_MINUS,    KEY_F11, APPLE_FLAG_TB_FKEY },
+       { KEY_EQUAL,    KEY_F12, APPLE_FLAG_TB_FKEY },
        { KEY_UP,       KEY_PAGEUP },
        { KEY_DOWN,     KEY_PAGEDOWN },
        { KEY_LEFT,     KEY_HOME },
@@ -424,7 +426,12 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
        unsigned int real_fnmode;
 
        if (fnmode == 3) {
-               real_fnmode = (asc->quirks & APPLE_IS_NON_APPLE) ? 2 : 1;
+               if (asc->quirks & APPLE_DISABLE_FKEYS)
+                       real_fnmode = 4;
+               else if (asc->quirks & APPLE_IS_NON_APPLE)
+                       real_fnmode = 2;
+               else
+                       real_fnmode = 1;
        } else {
                real_fnmode = fnmode;
        }
@@ -534,8 +541,16 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
                                                do_translate = asc->fn_on;
                                                break;
                                        default:
-                                               /* should never happen */
+                                               /* case 4 */
+                                               do_translate = false;
+                                       }
+                               } else if (trans->flags & APPLE_FLAG_TB_FKEY) {
+                                       switch (real_fnmode) {
+                                       case 4:
                                                do_translate = false;
+                                               break;
+                                       default:
+                                               do_translate = asc->fn_on;
                                        }
                                } else {
                                        do_translate = asc->fn_on;
@@ -1139,19 +1154,22 @@ static const struct hid_device_id apple_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J140K),
                .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J132),
-               .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
+               .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
+                       APPLE_DISABLE_FKEYS },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J680),
-               .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
+               .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
+                       APPLE_DISABLE_FKEYS },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J213),
-               .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK },
+               .driver_data = APPLE_HAS_FN | APPLE_BACKLIGHT_CTL | APPLE_ISO_TILDE_QUIRK |
+                       APPLE_DISABLE_FKEYS },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J214K),
-               .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J223),
-               .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J230K),
                .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRINGT2_J152F),
-               .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK },
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_DISABLE_FKEYS },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
                .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),