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
5557static unsigned int fnmode = 3 ;
5658module_param (fnmode , uint , 0644 );
5759MODULE_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
6062static int iso_layout = -1 ;
6163module_param (iso_layout , int , 0644 );
@@ -121,7 +123,7 @@ struct apple_sc {
121123struct apple_key_translation {
122124 u16 from ;
123125 u16 to ;
124- u8 flags ;
126+ unsigned long flags ;
125127};
126128
127129static const struct apple_key_translation magic_keyboard_alu_fn_keys [] = {
@@ -211,19 +213,19 @@ static const struct apple_key_translation macbookair_fn_keys[] = {
211213static 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[] = {
234236static 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