• Home
  • Raw
  • Download

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
48 #include <linux/input/sparse-keymap.h>
68 /* FUNC interface - command values */
74 /* FUNC interface - responses */
77 /* FUNC interface - status flags */
85 /* FUNC interface - LED control */
95 /* FUNC interface - backlight power control */
116 static int use_alt_lcd_levels = -1;
158 status = acpi_evaluate_integer(device->handle, "FUNC", &arg_list, in call_fext_func()
161 acpi_handle_err(device->handle, "Failed to evaluate FUNC\n"); in call_fext_func()
162 return -ENODEV; in call_fext_func()
165 acpi_handle_debug(device->handle, in call_fext_func()
180 case -1: in set_lcd_level()
181 if (acpi_has_method(device->handle, "SBL2")) in set_lcd_level()
194 acpi_handle_debug(device->handle, "set lcd level via %s [%d]\n", method, in set_lcd_level()
197 if (level < 0 || level >= priv->max_brightness) in set_lcd_level()
198 return -EINVAL; in set_lcd_level()
200 status = acpi_execute_simple_method(device->handle, method, level); in set_lcd_level()
202 acpi_handle_err(device->handle, "Failed to evaluate %s\n", in set_lcd_level()
204 return -ENODEV; in set_lcd_level()
207 priv->brightness_level = level; in set_lcd_level()
218 acpi_handle_debug(device->handle, "get lcd level via GBLL\n"); in get_lcd_level()
220 status = acpi_evaluate_integer(device->handle, "GBLL", NULL, &state); in get_lcd_level()
224 priv->brightness_level = state & 0x0fffffff; in get_lcd_level()
226 return priv->brightness_level; in get_lcd_level()
235 acpi_handle_debug(device->handle, "get max lcd level via RBLL\n"); in get_max_brightness()
237 status = acpi_evaluate_integer(device->handle, "RBLL", NULL, &state); in get_max_brightness()
239 return -1; in get_max_brightness()
241 priv->max_brightness = state; in get_max_brightness()
243 return priv->max_brightness; in get_max_brightness()
252 return b->props.power == FB_BLANK_POWERDOWN ? 0 : get_lcd_level(device); in bl_get_brightness()
260 if (b->props.power == FB_BLANK_POWERDOWN) in bl_update_status()
268 return set_lcd_level(device, b->props.brightness); in bl_update_status()
281 if (!(priv->flags_supported & FLAG_LID)) in lid_show()
283 if (priv->flags_state & FLAG_LID) in lid_show()
294 if (!(priv->flags_supported & FLAG_DOCK)) in dock_show()
296 if (priv->flags_state & FLAG_DOCK) in dock_show()
307 if (!(priv->flags_supported & FLAG_RFKILL)) in radios_show()
309 if (priv->flags_state & FLAG_RFKILL) in radios_show()
332 .name = "fujitsu-laptop",
349 priv->input = devm_input_allocate_device(&device->dev); in acpi_fujitsu_bl_input_setup()
350 if (!priv->input) in acpi_fujitsu_bl_input_setup()
351 return -ENOMEM; in acpi_fujitsu_bl_input_setup()
353 snprintf(priv->phys, sizeof(priv->phys), "%s/video/input0", in acpi_fujitsu_bl_input_setup()
356 priv->input->name = acpi_device_name(device); in acpi_fujitsu_bl_input_setup()
357 priv->input->phys = priv->phys; in acpi_fujitsu_bl_input_setup()
358 priv->input->id.bustype = BUS_HOST; in acpi_fujitsu_bl_input_setup()
359 priv->input->id.product = 0x06; in acpi_fujitsu_bl_input_setup()
361 ret = sparse_keymap_setup(priv->input, keymap_backlight, NULL); in acpi_fujitsu_bl_input_setup()
365 return input_register_device(priv->input); in acpi_fujitsu_bl_input_setup()
372 .brightness = priv->brightness_level, in fujitsu_backlight_register()
373 .max_brightness = priv->max_brightness - 1, in fujitsu_backlight_register()
378 bd = devm_backlight_device_register(&device->dev, "fujitsu-laptop", in fujitsu_backlight_register()
379 &device->dev, device, in fujitsu_backlight_register()
384 priv->bl_device = bd; in fujitsu_backlight_register()
395 return -ENODEV; in acpi_fujitsu_bl_add()
397 priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); in acpi_fujitsu_bl_add()
399 return -ENOMEM; in acpi_fujitsu_bl_add()
404 device->driver_data = priv; in acpi_fujitsu_bl_add()
410 priv->max_brightness = FUJITSU_LCD_N_LEVELS; in acpi_fujitsu_bl_add()
428 acpi_handle_info(device->handle, "unsupported event [0x%x]\n", in acpi_fujitsu_bl_notify()
430 sparse_keymap_report_event(priv->input, -1, 1, true); in acpi_fujitsu_bl_notify()
434 oldb = priv->brightness_level; in acpi_fujitsu_bl_notify()
436 newb = priv->brightness_level; in acpi_fujitsu_bl_notify()
438 acpi_handle_debug(device->handle, in acpi_fujitsu_bl_notify()
439 "brightness button event [%i -> %i]\n", oldb, newb); in acpi_fujitsu_bl_notify()
447 sparse_keymap_report_event(priv->input, oldb < newb, 1, true); in acpi_fujitsu_bl_notify()
485 { KE_KEY, KEY4_CODE, { KEY_EMAIL } }, /* "E-mail" */
493 static const struct key_entry *keymap = keymap_default; variable
497 pr_info("Identified laptop model '%s'\n", id->ident); in fujitsu_laptop_dmi_keymap_override()
498 keymap = id->driver_data; in fujitsu_laptop_dmi_keymap_override()
547 priv->input = devm_input_allocate_device(&device->dev); in acpi_fujitsu_laptop_input_setup()
548 if (!priv->input) in acpi_fujitsu_laptop_input_setup()
549 return -ENOMEM; in acpi_fujitsu_laptop_input_setup()
551 snprintf(priv->phys, sizeof(priv->phys), "%s/input0", in acpi_fujitsu_laptop_input_setup()
554 priv->input->name = acpi_device_name(device); in acpi_fujitsu_laptop_input_setup()
555 priv->input->phys = priv->phys; in acpi_fujitsu_laptop_input_setup()
556 priv->input->id.bustype = BUS_HOST; in acpi_fujitsu_laptop_input_setup()
559 ret = sparse_keymap_setup(priv->input, keymap, NULL); in acpi_fujitsu_laptop_input_setup()
563 return input_register_device(priv->input); in acpi_fujitsu_laptop_input_setup()
571 priv->pf_device = platform_device_alloc("fujitsu-laptop", PLATFORM_DEVID_NONE); in fujitsu_laptop_platform_add()
572 if (!priv->pf_device) in fujitsu_laptop_platform_add()
573 return -ENOMEM; in fujitsu_laptop_platform_add()
575 platform_set_drvdata(priv->pf_device, priv); in fujitsu_laptop_platform_add()
577 ret = platform_device_add(priv->pf_device); in fujitsu_laptop_platform_add()
581 ret = sysfs_create_group(&priv->pf_device->dev.kobj, in fujitsu_laptop_platform_add()
589 platform_device_del(priv->pf_device); in fujitsu_laptop_platform_add()
591 platform_device_put(priv->pf_device); in fujitsu_laptop_platform_add()
600 sysfs_remove_group(&priv->pf_device->dev.kobj, in fujitsu_laptop_platform_remove()
602 platform_device_unregister(priv->pf_device); in fujitsu_laptop_platform_remove()
608 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in logolamp_set()
627 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in logolamp_get()
644 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in kblamps_set()
656 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in kblamps_get()
669 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in radio_led_set()
681 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in radio_led_get()
693 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in eco_led_set()
707 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in eco_led_get()
724 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
726 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
728 led->name = "fujitsu::logolamp"; in acpi_fujitsu_laptop_leds_register()
729 led->brightness_set_blocking = logolamp_set; in acpi_fujitsu_laptop_leds_register()
730 led->brightness_get = logolamp_get; in acpi_fujitsu_laptop_leds_register()
731 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
739 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
741 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
743 led->name = "fujitsu::kblamps"; in acpi_fujitsu_laptop_leds_register()
744 led->brightness_set_blocking = kblamps_set; in acpi_fujitsu_laptop_leds_register()
745 led->brightness_get = kblamps_get; in acpi_fujitsu_laptop_leds_register()
746 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
760 if (priv->flags_supported & BIT(17)) { in acpi_fujitsu_laptop_leds_register()
761 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
763 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
765 led->name = "fujitsu::radio_led"; in acpi_fujitsu_laptop_leds_register()
766 led->brightness_set_blocking = radio_led_set; in acpi_fujitsu_laptop_leds_register()
767 led->brightness_get = radio_led_get; in acpi_fujitsu_laptop_leds_register()
768 led->default_trigger = "rfkill-any"; in acpi_fujitsu_laptop_leds_register()
769 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
782 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
784 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
786 led->name = "fujitsu::eco_led"; in acpi_fujitsu_laptop_leds_register()
787 led->brightness_set_blocking = eco_led_set; in acpi_fujitsu_laptop_leds_register()
788 led->brightness_get = eco_led_get; in acpi_fujitsu_laptop_leds_register()
789 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
802 priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); in acpi_fujitsu_laptop_add()
804 return -ENOMEM; in acpi_fujitsu_laptop_add()
811 device->driver_data = priv; in acpi_fujitsu_laptop_add()
814 spin_lock_init(&priv->fifo_lock); in acpi_fujitsu_laptop_add()
815 ret = kfifo_alloc(&priv->fifo, RINGBUFFERSIZE * sizeof(int), in acpi_fujitsu_laptop_add()
826 acpi_handle_debug(device->handle, "Discarded %i ringbuffer entries\n", in acpi_fujitsu_laptop_add()
829 priv->flags_supported = call_fext_func(device, FUNC_FLAGS, 0x0, 0x0, in acpi_fujitsu_laptop_add()
834 if (priv->flags_supported == UNSUPPORTED_CMD) in acpi_fujitsu_laptop_add()
835 priv->flags_supported = 0; in acpi_fujitsu_laptop_add()
837 if (priv->flags_supported) in acpi_fujitsu_laptop_add()
838 priv->flags_state = call_fext_func(device, FUNC_FLAGS, 0x4, 0x0, in acpi_fujitsu_laptop_add()
841 /* Suspect this is a keymap of the application panel, print it */ in acpi_fujitsu_laptop_add()
842 acpi_handle_info(device->handle, "BTNI: [0x%x]\n", in acpi_fujitsu_laptop_add()
846 if (fujitsu_bl && fujitsu_bl->bl_device && in acpi_fujitsu_laptop_add()
850 fujitsu_bl->bl_device->props.power = FB_BLANK_POWERDOWN; in acpi_fujitsu_laptop_add()
852 fujitsu_bl->bl_device->props.power = FB_BLANK_UNBLANK; in acpi_fujitsu_laptop_add()
870 kfifo_free(&priv->fifo); in acpi_fujitsu_laptop_add()
881 kfifo_free(&priv->fifo); in acpi_fujitsu_laptop_remove()
889 ret = kfifo_in_locked(&priv->fifo, (unsigned char *)&scancode, in acpi_fujitsu_laptop_press()
890 sizeof(scancode), &priv->fifo_lock); in acpi_fujitsu_laptop_press()
892 dev_info(&priv->input->dev, "Could not push scancode [0x%x]\n", in acpi_fujitsu_laptop_press()
896 sparse_keymap_report_event(priv->input, scancode, 1, false); in acpi_fujitsu_laptop_press()
897 dev_dbg(&priv->input->dev, "Push scancode into ringbuffer [0x%x]\n", in acpi_fujitsu_laptop_press()
907 ret = kfifo_out_locked(&priv->fifo, (unsigned char *)&scancode, in acpi_fujitsu_laptop_release()
908 sizeof(scancode), &priv->fifo_lock); in acpi_fujitsu_laptop_release()
911 sparse_keymap_report_event(priv->input, scancode, 0, false); in acpi_fujitsu_laptop_release()
912 dev_dbg(&priv->input->dev, in acpi_fujitsu_laptop_release()
925 acpi_handle_info(device->handle, "Unsupported event [0x%x]\n", in acpi_fujitsu_laptop_notify()
927 sparse_keymap_report_event(priv->input, -1, 1, true); in acpi_fujitsu_laptop_notify()
931 if (priv->flags_supported) in acpi_fujitsu_laptop_notify()
932 priv->flags_state = call_fext_func(device, FUNC_FLAGS, 0x4, 0x0, in acpi_fujitsu_laptop_notify()
939 if (sparse_keymap_entry_from_scancode(priv->input, scancode)) in acpi_fujitsu_laptop_notify()
944 acpi_handle_info(device->handle, in acpi_fujitsu_laptop_notify()
949 * First seen on the Skylake-based Lifebook E736/E746/E756), the in acpi_fujitsu_laptop_notify()
950 * touchpad toggle hotkey (Fn+F4) is handled in software. Other models in acpi_fujitsu_laptop_notify()
954 if (priv->flags_supported & (FLAG_SOFTKEYS)) { in acpi_fujitsu_laptop_notify()
958 sparse_keymap_report_event(priv->input, BIT(i), 1, true); in acpi_fujitsu_laptop_notify()
1049 MODULE_PARM_DESC(use_alt_lcd_levels, "Interface used for setting LCD brightness level (-1 = auto, 0…