Lines Matching +full:fn +full:- +full:keymap

1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*-*-linux-c-*-*/
10 Adrian Yee <brewt-fujitsu@brewt.org>
12 Templated from msi-laptop.c and thinkpad_acpi.c which is copyright
18 * fujitsu-laptop.c - Fujitsu laptop support, providing access to additional
22 * This driver implements a vendor-specific backlight control interface for
27 * P8010. It should work on most P-series and S-series Lifebooks, but
47 #include <linux/input/sparse-keymap.h>
69 /* FUNC interface - command values */
75 /* FUNC interface - responses */
78 /* FUNC interface - status flags */
86 /* FUNC interface - LED control */
96 /* FUNC interface - backlight power control */
101 /* FUNC interface - battery control interface */
121 static int use_alt_lcd_levels = -1;
164 status = acpi_evaluate_integer(device->handle, "FUNC", &arg_list, in call_fext_func()
167 acpi_handle_err(device->handle, "Failed to evaluate FUNC\n"); in call_fext_func()
168 return -ENODEV; in call_fext_func()
171 acpi_handle_debug(device->handle, in call_fext_func()
191 return -EINVAL; in charge_control_end_threshold_store()
206 return -EINVAL; in charge_control_end_threshold_store()
231 return device_create_file(&battery->dev, in fujitsu_battery_add_hook()
238 device_remove_file(&battery->dev, in fujitsu_battery_remove_hook()
259 priv->charge_control_supported = false; in fujitsu_battery_charge_control_add()
269 return -ENODEV; in fujitsu_battery_charge_control_add()
271 priv->charge_control_supported = true; in fujitsu_battery_charge_control_add()
281 if (priv->charge_control_supported) in fujitsu_battery_charge_control_remove()
294 case -1: in set_lcd_level()
295 if (acpi_has_method(device->handle, "SBL2")) in set_lcd_level()
308 acpi_handle_debug(device->handle, "set lcd level via %s [%d]\n", method, in set_lcd_level()
311 if (level < 0 || level >= priv->max_brightness) in set_lcd_level()
312 return -EINVAL; in set_lcd_level()
314 status = acpi_execute_simple_method(device->handle, method, level); in set_lcd_level()
316 acpi_handle_err(device->handle, "Failed to evaluate %s\n", in set_lcd_level()
318 return -ENODEV; in set_lcd_level()
321 priv->brightness_level = level; in set_lcd_level()
332 acpi_handle_debug(device->handle, "get lcd level via GBLL\n"); in get_lcd_level()
334 status = acpi_evaluate_integer(device->handle, "GBLL", NULL, &state); in get_lcd_level()
338 priv->brightness_level = state & 0x0fffffff; in get_lcd_level()
340 return priv->brightness_level; in get_lcd_level()
349 acpi_handle_debug(device->handle, "get max lcd level via RBLL\n"); in get_max_brightness()
351 status = acpi_evaluate_integer(device->handle, "RBLL", NULL, &state); in get_max_brightness()
353 return -1; in get_max_brightness()
355 priv->max_brightness = state; in get_max_brightness()
357 return priv->max_brightness; in get_max_brightness()
366 return b->props.power == BACKLIGHT_POWER_OFF ? 0 : get_lcd_level(device); in bl_get_brightness()
374 if (b->props.power == BACKLIGHT_POWER_OFF) in bl_update_status()
382 return set_lcd_level(device, b->props.brightness); in bl_update_status()
395 if (!(priv->flags_supported & FLAG_LID)) in lid_show()
397 if (priv->flags_state & FLAG_LID) in lid_show()
408 if (!(priv->flags_supported & FLAG_DOCK)) in dock_show()
410 if (priv->flags_state & FLAG_DOCK) in dock_show()
421 if (!(priv->flags_supported & FLAG_RFKILL)) in radios_show()
423 if (priv->flags_state & FLAG_RFKILL) in radios_show()
446 .name = "fujitsu-laptop",
463 priv->input = devm_input_allocate_device(&device->dev); in acpi_fujitsu_bl_input_setup()
464 if (!priv->input) in acpi_fujitsu_bl_input_setup()
465 return -ENOMEM; in acpi_fujitsu_bl_input_setup()
467 snprintf(priv->phys, sizeof(priv->phys), "%s/video/input0", in acpi_fujitsu_bl_input_setup()
470 priv->input->name = acpi_device_name(device); in acpi_fujitsu_bl_input_setup()
471 priv->input->phys = priv->phys; in acpi_fujitsu_bl_input_setup()
472 priv->input->id.bustype = BUS_HOST; in acpi_fujitsu_bl_input_setup()
473 priv->input->id.product = 0x06; in acpi_fujitsu_bl_input_setup()
475 ret = sparse_keymap_setup(priv->input, keymap_backlight, NULL); in acpi_fujitsu_bl_input_setup()
479 return input_register_device(priv->input); in acpi_fujitsu_bl_input_setup()
486 .brightness = priv->brightness_level, in fujitsu_backlight_register()
487 .max_brightness = priv->max_brightness - 1, in fujitsu_backlight_register()
492 bd = devm_backlight_device_register(&device->dev, "fujitsu-laptop", in fujitsu_backlight_register()
493 &device->dev, device, in fujitsu_backlight_register()
498 priv->bl_device = bd; in fujitsu_backlight_register()
509 return -ENODEV; in acpi_fujitsu_bl_add()
511 priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); in acpi_fujitsu_bl_add()
513 return -ENOMEM; in acpi_fujitsu_bl_add()
518 device->driver_data = priv; in acpi_fujitsu_bl_add()
524 priv->max_brightness = FUJITSU_LCD_N_LEVELS; in acpi_fujitsu_bl_add()
542 acpi_handle_info(device->handle, "unsupported event [0x%x]\n", in acpi_fujitsu_bl_notify()
544 sparse_keymap_report_event(priv->input, -1, 1, true); in acpi_fujitsu_bl_notify()
548 oldb = priv->brightness_level; in acpi_fujitsu_bl_notify()
550 newb = priv->brightness_level; in acpi_fujitsu_bl_notify()
552 acpi_handle_debug(device->handle, in acpi_fujitsu_bl_notify()
553 "brightness button event [%i -> %i]\n", oldb, newb); in acpi_fujitsu_bl_notify()
561 sparse_keymap_report_event(priv->input, oldb < newb, 1, true); in acpi_fujitsu_bl_notify()
599 { KE_KEY, KEY4_CODE, { KEY_EMAIL } }, /* "E-mail" */
607 static const struct key_entry *keymap = keymap_default; variable
611 pr_info("Identified laptop model '%s'\n", id->ident); in fujitsu_laptop_dmi_keymap_override()
612 keymap = id->driver_data; in fujitsu_laptop_dmi_keymap_override()
661 priv->input = devm_input_allocate_device(&device->dev); in acpi_fujitsu_laptop_input_setup()
662 if (!priv->input) in acpi_fujitsu_laptop_input_setup()
663 return -ENOMEM; in acpi_fujitsu_laptop_input_setup()
665 snprintf(priv->phys, sizeof(priv->phys), "%s/input0", in acpi_fujitsu_laptop_input_setup()
668 priv->input->name = acpi_device_name(device); in acpi_fujitsu_laptop_input_setup()
669 priv->input->phys = priv->phys; in acpi_fujitsu_laptop_input_setup()
670 priv->input->id.bustype = BUS_HOST; in acpi_fujitsu_laptop_input_setup()
673 ret = sparse_keymap_setup(priv->input, keymap, NULL); in acpi_fujitsu_laptop_input_setup()
677 return input_register_device(priv->input); in acpi_fujitsu_laptop_input_setup()
685 priv->pf_device = platform_device_alloc("fujitsu-laptop", PLATFORM_DEVID_NONE); in fujitsu_laptop_platform_add()
686 if (!priv->pf_device) in fujitsu_laptop_platform_add()
687 return -ENOMEM; in fujitsu_laptop_platform_add()
689 platform_set_drvdata(priv->pf_device, priv); in fujitsu_laptop_platform_add()
691 ret = platform_device_add(priv->pf_device); in fujitsu_laptop_platform_add()
695 ret = sysfs_create_group(&priv->pf_device->dev.kobj, in fujitsu_laptop_platform_add()
703 platform_device_del(priv->pf_device); in fujitsu_laptop_platform_add()
705 platform_device_put(priv->pf_device); in fujitsu_laptop_platform_add()
714 sysfs_remove_group(&priv->pf_device->dev.kobj, in fujitsu_laptop_platform_remove()
716 platform_device_unregister(priv->pf_device); in fujitsu_laptop_platform_remove()
722 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in logolamp_set()
741 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in logolamp_get()
758 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in kblamps_set()
770 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in kblamps_get()
783 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in radio_led_set()
795 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in radio_led_get()
807 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in eco_led_set()
821 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in eco_led_get()
838 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
840 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
842 led->name = "fujitsu::logolamp"; in acpi_fujitsu_laptop_leds_register()
843 led->brightness_set_blocking = logolamp_set; in acpi_fujitsu_laptop_leds_register()
844 led->brightness_get = logolamp_get; in acpi_fujitsu_laptop_leds_register()
845 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
853 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
855 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
857 led->name = "fujitsu::kblamps"; in acpi_fujitsu_laptop_leds_register()
858 led->brightness_set_blocking = kblamps_set; in acpi_fujitsu_laptop_leds_register()
859 led->brightness_get = kblamps_get; in acpi_fujitsu_laptop_leds_register()
860 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
874 if (priv->flags_supported & BIT(17)) { in acpi_fujitsu_laptop_leds_register()
875 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
877 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
879 led->name = "fujitsu::radio_led"; in acpi_fujitsu_laptop_leds_register()
880 led->brightness_set_blocking = radio_led_set; in acpi_fujitsu_laptop_leds_register()
881 led->brightness_get = radio_led_get; in acpi_fujitsu_laptop_leds_register()
882 led->default_trigger = "rfkill-any"; in acpi_fujitsu_laptop_leds_register()
883 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
896 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
898 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
900 led->name = "fujitsu::eco_led"; in acpi_fujitsu_laptop_leds_register()
901 led->brightness_set_blocking = eco_led_set; in acpi_fujitsu_laptop_leds_register()
902 led->brightness_get = eco_led_get; in acpi_fujitsu_laptop_leds_register()
903 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
916 priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); in acpi_fujitsu_laptop_add()
918 return -ENOMEM; in acpi_fujitsu_laptop_add()
925 device->driver_data = priv; in acpi_fujitsu_laptop_add()
928 spin_lock_init(&priv->fifo_lock); in acpi_fujitsu_laptop_add()
929 ret = kfifo_alloc(&priv->fifo, RINGBUFFERSIZE * sizeof(int), in acpi_fujitsu_laptop_add()
940 acpi_handle_debug(device->handle, "Discarded %i ringbuffer entries\n", in acpi_fujitsu_laptop_add()
943 priv->flags_supported = call_fext_func(device, FUNC_FLAGS, 0x0, 0x0, in acpi_fujitsu_laptop_add()
948 if (priv->flags_supported == UNSUPPORTED_CMD) in acpi_fujitsu_laptop_add()
949 priv->flags_supported = 0; in acpi_fujitsu_laptop_add()
951 if (priv->flags_supported) in acpi_fujitsu_laptop_add()
952 priv->flags_state = call_fext_func(device, FUNC_FLAGS, 0x4, 0x0, in acpi_fujitsu_laptop_add()
955 /* Suspect this is a keymap of the application panel, print it */ in acpi_fujitsu_laptop_add()
956 acpi_handle_info(device->handle, "BTNI: [0x%x]\n", in acpi_fujitsu_laptop_add()
960 if (fujitsu_bl && fujitsu_bl->bl_device && in acpi_fujitsu_laptop_add()
964 fujitsu_bl->bl_device->props.power = BACKLIGHT_POWER_OFF; in acpi_fujitsu_laptop_add()
966 fujitsu_bl->bl_device->props.power = BACKLIGHT_POWER_ON; in acpi_fujitsu_laptop_add()
988 kfifo_free(&priv->fifo); in acpi_fujitsu_laptop_add()
1001 kfifo_free(&priv->fifo); in acpi_fujitsu_laptop_remove()
1009 ret = kfifo_in_locked(&priv->fifo, (unsigned char *)&scancode, in acpi_fujitsu_laptop_press()
1010 sizeof(scancode), &priv->fifo_lock); in acpi_fujitsu_laptop_press()
1012 dev_info(&priv->input->dev, "Could not push scancode [0x%x]\n", in acpi_fujitsu_laptop_press()
1016 sparse_keymap_report_event(priv->input, scancode, 1, false); in acpi_fujitsu_laptop_press()
1017 dev_dbg(&priv->input->dev, "Push scancode into ringbuffer [0x%x]\n", in acpi_fujitsu_laptop_press()
1027 ret = kfifo_out_locked(&priv->fifo, (unsigned char *)&scancode, in acpi_fujitsu_laptop_release()
1028 sizeof(scancode), &priv->fifo_lock); in acpi_fujitsu_laptop_release()
1031 sparse_keymap_report_event(priv->input, scancode, 0, false); in acpi_fujitsu_laptop_release()
1032 dev_dbg(&priv->input->dev, in acpi_fujitsu_laptop_release()
1045 acpi_handle_info(device->handle, "Unsupported event [0x%x]\n", in acpi_fujitsu_laptop_notify()
1047 sparse_keymap_report_event(priv->input, -1, 1, true); in acpi_fujitsu_laptop_notify()
1051 if (priv->flags_supported) in acpi_fujitsu_laptop_notify()
1052 priv->flags_state = call_fext_func(device, FUNC_FLAGS, 0x4, 0x0, in acpi_fujitsu_laptop_notify()
1059 if (sparse_keymap_entry_from_scancode(priv->input, scancode)) in acpi_fujitsu_laptop_notify()
1064 acpi_handle_info(device->handle, in acpi_fujitsu_laptop_notify()
1069 * First seen on the Skylake-based Lifebook E736/E746/E756), the in acpi_fujitsu_laptop_notify()
1070 * touchpad toggle hotkey (Fn+F4) is handled in software. Other models in acpi_fujitsu_laptop_notify()
1074 if (priv->flags_supported & (FLAG_SOFTKEYS)) { in acpi_fujitsu_laptop_notify()
1078 sparse_keymap_report_event(priv->input, BIT(i), 1, true); in acpi_fujitsu_laptop_notify()
1169 MODULE_PARM_DESC(use_alt_lcd_levels, "Interface used for setting LCD brightness level (-1 = auto, 0…