Lines Matching +full:brightness +full:- +full:level
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*-*-linux-c-*-*/
10 Adrian Yee <brewt-[email protected]>
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
31 * brightness controls which are used by different Fujitsu laptops. In most
47 #include <linux/input/sparse-keymap.h>
61 #define ACPI_FUJITSU_BL_DRIVER_NAME "Fujitsu laptop FUJ02B1 ACPI brightness driver"
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 */
117 static int use_alt_lcd_levels = -1;
160 status = acpi_evaluate_integer(device->handle, "FUNC", &arg_list, in call_fext_func()
163 acpi_handle_err(device->handle, "Failed to evaluate FUNC\n"); in call_fext_func()
164 return -ENODEV; in call_fext_func()
167 acpi_handle_debug(device->handle, in call_fext_func()
186 return -EINVAL; in charge_control_end_threshold_store()
198 return -EINVAL; in charge_control_end_threshold_store()
223 return device_create_file(&battery->dev, in fujitsu_battery_add_hook()
230 device_remove_file(&battery->dev, in fujitsu_battery_remove_hook()
251 priv->charge_control_supported = false; in fujitsu_battery_charge_control_add()
261 return -ENODEV; in fujitsu_battery_charge_control_add()
263 priv->charge_control_supported = true; in fujitsu_battery_charge_control_add()
273 if (priv->charge_control_supported) in fujitsu_battery_charge_control_remove()
277 /* Hardware access for LCD brightness control */
279 static int set_lcd_level(struct acpi_device *device, int level) in set_lcd_level() argument
286 case -1: in set_lcd_level()
287 if (acpi_has_method(device->handle, "SBL2")) in set_lcd_level()
300 acpi_handle_debug(device->handle, "set lcd level via %s [%d]\n", method, in set_lcd_level()
301 level); in set_lcd_level()
303 if (level < 0 || level >= priv->max_brightness) in set_lcd_level()
304 return -EINVAL; in set_lcd_level()
306 status = acpi_execute_simple_method(device->handle, method, level); in set_lcd_level()
308 acpi_handle_err(device->handle, "Failed to evaluate %s\n", in set_lcd_level()
310 return -ENODEV; in set_lcd_level()
313 priv->brightness_level = level; in set_lcd_level()
324 acpi_handle_debug(device->handle, "get lcd level via GBLL\n"); in get_lcd_level()
326 status = acpi_evaluate_integer(device->handle, "GBLL", NULL, &state); in get_lcd_level()
330 priv->brightness_level = state & 0x0fffffff; in get_lcd_level()
332 return priv->brightness_level; in get_lcd_level()
341 acpi_handle_debug(device->handle, "get max lcd level via RBLL\n"); in get_max_brightness()
343 status = acpi_evaluate_integer(device->handle, "RBLL", NULL, &state); in get_max_brightness()
345 return -1; in get_max_brightness()
347 priv->max_brightness = state; in get_max_brightness()
349 return priv->max_brightness; in get_max_brightness()
358 return b->props.power == BACKLIGHT_POWER_OFF ? 0 : get_lcd_level(device); in bl_get_brightness()
366 if (b->props.power == BACKLIGHT_POWER_OFF) in bl_update_status()
374 return set_lcd_level(device, b->props.brightness); in bl_update_status()
387 if (!(priv->flags_supported & FLAG_LID)) in lid_show()
389 if (priv->flags_state & FLAG_LID) in lid_show()
400 if (!(priv->flags_supported & FLAG_DOCK)) in dock_show()
402 if (priv->flags_state & FLAG_DOCK) in dock_show()
413 if (!(priv->flags_supported & FLAG_RFKILL)) in radios_show()
415 if (priv->flags_state & FLAG_RFKILL) in radios_show()
438 .name = "fujitsu-laptop",
442 /* ACPI device for LCD brightness control */
455 priv->input = devm_input_allocate_device(&device->dev); in acpi_fujitsu_bl_input_setup()
456 if (!priv->input) in acpi_fujitsu_bl_input_setup()
457 return -ENOMEM; in acpi_fujitsu_bl_input_setup()
459 snprintf(priv->phys, sizeof(priv->phys), "%s/video/input0", in acpi_fujitsu_bl_input_setup()
462 priv->input->name = acpi_device_name(device); in acpi_fujitsu_bl_input_setup()
463 priv->input->phys = priv->phys; in acpi_fujitsu_bl_input_setup()
464 priv->input->id.bustype = BUS_HOST; in acpi_fujitsu_bl_input_setup()
465 priv->input->id.product = 0x06; in acpi_fujitsu_bl_input_setup()
467 ret = sparse_keymap_setup(priv->input, keymap_backlight, NULL); in acpi_fujitsu_bl_input_setup()
471 return input_register_device(priv->input); in acpi_fujitsu_bl_input_setup()
478 .brightness = priv->brightness_level, in fujitsu_backlight_register()
479 .max_brightness = priv->max_brightness - 1, in fujitsu_backlight_register()
484 bd = devm_backlight_device_register(&device->dev, "fujitsu-laptop", in fujitsu_backlight_register()
485 &device->dev, device, in fujitsu_backlight_register()
490 priv->bl_device = bd; in fujitsu_backlight_register()
501 return -ENODEV; in acpi_fujitsu_bl_add()
503 priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); in acpi_fujitsu_bl_add()
505 return -ENOMEM; in acpi_fujitsu_bl_add()
510 device->driver_data = priv; in acpi_fujitsu_bl_add()
516 priv->max_brightness = FUJITSU_LCD_N_LEVELS; in acpi_fujitsu_bl_add()
526 /* Brightness notify */
534 acpi_handle_info(device->handle, "unsupported event [0x%x]\n", in acpi_fujitsu_bl_notify()
536 sparse_keymap_report_event(priv->input, -1, 1, true); in acpi_fujitsu_bl_notify()
540 oldb = priv->brightness_level; in acpi_fujitsu_bl_notify()
542 newb = priv->brightness_level; in acpi_fujitsu_bl_notify()
544 acpi_handle_debug(device->handle, in acpi_fujitsu_bl_notify()
545 "brightness button event [%i -> %i]\n", oldb, newb); in acpi_fujitsu_bl_notify()
553 sparse_keymap_report_event(priv->input, oldb < newb, 1, true); in acpi_fujitsu_bl_notify()
591 pr_info("Identified laptop model '%s'\n", id->ident); in fujitsu_laptop_dmi_keymap_override()
592 keymap = id->driver_data; in fujitsu_laptop_dmi_keymap_override()
632 priv->input = devm_input_allocate_device(&device->dev); in acpi_fujitsu_laptop_input_setup()
633 if (!priv->input) in acpi_fujitsu_laptop_input_setup()
634 return -ENOMEM; in acpi_fujitsu_laptop_input_setup()
636 snprintf(priv->phys, sizeof(priv->phys), "%s/input0", in acpi_fujitsu_laptop_input_setup()
639 priv->input->name = acpi_device_name(device); in acpi_fujitsu_laptop_input_setup()
640 priv->input->phys = priv->phys; in acpi_fujitsu_laptop_input_setup()
641 priv->input->id.bustype = BUS_HOST; in acpi_fujitsu_laptop_input_setup()
644 ret = sparse_keymap_setup(priv->input, keymap, NULL); in acpi_fujitsu_laptop_input_setup()
648 return input_register_device(priv->input); in acpi_fujitsu_laptop_input_setup()
656 priv->pf_device = platform_device_alloc("fujitsu-laptop", PLATFORM_DEVID_NONE); in fujitsu_laptop_platform_add()
657 if (!priv->pf_device) in fujitsu_laptop_platform_add()
658 return -ENOMEM; in fujitsu_laptop_platform_add()
660 platform_set_drvdata(priv->pf_device, priv); in fujitsu_laptop_platform_add()
662 ret = platform_device_add(priv->pf_device); in fujitsu_laptop_platform_add()
666 ret = sysfs_create_group(&priv->pf_device->dev.kobj, in fujitsu_laptop_platform_add()
674 platform_device_del(priv->pf_device); in fujitsu_laptop_platform_add()
676 platform_device_put(priv->pf_device); in fujitsu_laptop_platform_add()
685 sysfs_remove_group(&priv->pf_device->dev.kobj, in fujitsu_laptop_platform_remove()
687 platform_device_unregister(priv->pf_device); in fujitsu_laptop_platform_remove()
691 enum led_brightness brightness) in logolamp_set() argument
693 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in logolamp_set()
697 if (brightness < LED_HALF) in logolamp_set()
700 if (brightness < LED_FULL) in logolamp_set()
712 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in logolamp_get()
727 enum led_brightness brightness) in kblamps_set() argument
729 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in kblamps_set()
731 if (brightness >= LED_FULL) in kblamps_set()
741 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in kblamps_get()
742 enum led_brightness brightness = LED_OFF; in kblamps_get() local
746 brightness = LED_FULL; in kblamps_get()
748 return brightness; in kblamps_get()
752 enum led_brightness brightness) in radio_led_set() argument
754 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in radio_led_set()
756 if (brightness >= LED_FULL) in radio_led_set()
766 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in radio_led_get()
767 enum led_brightness brightness = LED_OFF; in radio_led_get() local
770 brightness = LED_FULL; in radio_led_get()
772 return brightness; in radio_led_get()
776 enum led_brightness brightness) in eco_led_set() argument
778 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in eco_led_set()
782 if (brightness >= LED_FULL) in eco_led_set()
792 struct acpi_device *device = to_acpi_device(cdev->dev->parent); in eco_led_get()
793 enum led_brightness brightness = LED_OFF; in eco_led_get() local
796 brightness = LED_FULL; in eco_led_get()
798 return brightness; in eco_led_get()
809 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
811 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
813 led->name = "fujitsu::logolamp"; in acpi_fujitsu_laptop_leds_register()
814 led->brightness_set_blocking = logolamp_set; in acpi_fujitsu_laptop_leds_register()
815 led->brightness_get = logolamp_get; in acpi_fujitsu_laptop_leds_register()
816 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
824 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
826 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
828 led->name = "fujitsu::kblamps"; in acpi_fujitsu_laptop_leds_register()
829 led->brightness_set_blocking = kblamps_set; in acpi_fujitsu_laptop_leds_register()
830 led->brightness_get = kblamps_get; in acpi_fujitsu_laptop_leds_register()
831 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
845 if (priv->flags_supported & BIT(17)) { in acpi_fujitsu_laptop_leds_register()
846 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
848 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
850 led->name = "fujitsu::radio_led"; in acpi_fujitsu_laptop_leds_register()
851 led->brightness_set_blocking = radio_led_set; in acpi_fujitsu_laptop_leds_register()
852 led->brightness_get = radio_led_get; in acpi_fujitsu_laptop_leds_register()
853 led->default_trigger = "rfkill-any"; in acpi_fujitsu_laptop_leds_register()
854 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
867 led = devm_kzalloc(&device->dev, sizeof(*led), GFP_KERNEL); in acpi_fujitsu_laptop_leds_register()
869 return -ENOMEM; in acpi_fujitsu_laptop_leds_register()
871 led->name = "fujitsu::eco_led"; in acpi_fujitsu_laptop_leds_register()
872 led->brightness_set_blocking = eco_led_set; in acpi_fujitsu_laptop_leds_register()
873 led->brightness_get = eco_led_get; in acpi_fujitsu_laptop_leds_register()
874 ret = devm_led_classdev_register(&device->dev, led); in acpi_fujitsu_laptop_leds_register()
887 priv = devm_kzalloc(&device->dev, sizeof(*priv), GFP_KERNEL); in acpi_fujitsu_laptop_add()
889 return -ENOMEM; in acpi_fujitsu_laptop_add()
896 device->driver_data = priv; in acpi_fujitsu_laptop_add()
899 spin_lock_init(&priv->fifo_lock); in acpi_fujitsu_laptop_add()
900 ret = kfifo_alloc(&priv->fifo, RINGBUFFERSIZE * sizeof(int), in acpi_fujitsu_laptop_add()
911 acpi_handle_debug(device->handle, "Discarded %i ringbuffer entries\n", in acpi_fujitsu_laptop_add()
914 priv->flags_supported = call_fext_func(device, FUNC_FLAGS, 0x0, 0x0, in acpi_fujitsu_laptop_add()
919 if (priv->flags_supported == UNSUPPORTED_CMD) in acpi_fujitsu_laptop_add()
920 priv->flags_supported = 0; in acpi_fujitsu_laptop_add()
922 if (priv->flags_supported) in acpi_fujitsu_laptop_add()
923 priv->flags_state = call_fext_func(device, FUNC_FLAGS, 0x4, 0x0, in acpi_fujitsu_laptop_add()
927 acpi_handle_info(device->handle, "BTNI: [0x%x]\n", in acpi_fujitsu_laptop_add()
931 if (fujitsu_bl && fujitsu_bl->bl_device && in acpi_fujitsu_laptop_add()
935 fujitsu_bl->bl_device->props.power = BACKLIGHT_POWER_OFF; in acpi_fujitsu_laptop_add()
937 fujitsu_bl->bl_device->props.power = BACKLIGHT_POWER_ON; in acpi_fujitsu_laptop_add()
959 kfifo_free(&priv->fifo); in acpi_fujitsu_laptop_add()
972 kfifo_free(&priv->fifo); in acpi_fujitsu_laptop_remove()
980 ret = kfifo_in_locked(&priv->fifo, (unsigned char *)&scancode, in acpi_fujitsu_laptop_press()
981 sizeof(scancode), &priv->fifo_lock); in acpi_fujitsu_laptop_press()
983 dev_info(&priv->input->dev, "Could not push scancode [0x%x]\n", in acpi_fujitsu_laptop_press()
987 sparse_keymap_report_event(priv->input, scancode, 1, false); in acpi_fujitsu_laptop_press()
988 dev_dbg(&priv->input->dev, "Push scancode into ringbuffer [0x%x]\n", in acpi_fujitsu_laptop_press()
998 ret = kfifo_out_locked(&priv->fifo, (unsigned char *)&scancode, in acpi_fujitsu_laptop_release()
999 sizeof(scancode), &priv->fifo_lock); in acpi_fujitsu_laptop_release()
1002 sparse_keymap_report_event(priv->input, scancode, 0, false); in acpi_fujitsu_laptop_release()
1003 dev_dbg(&priv->input->dev, in acpi_fujitsu_laptop_release()
1016 acpi_handle_info(device->handle, "Unsupported event [0x%x]\n", in acpi_fujitsu_laptop_notify()
1018 sparse_keymap_report_event(priv->input, -1, 1, true); in acpi_fujitsu_laptop_notify()
1022 if (priv->flags_supported) in acpi_fujitsu_laptop_notify()
1023 priv->flags_state = call_fext_func(device, FUNC_FLAGS, 0x4, 0x0, in acpi_fujitsu_laptop_notify()
1030 if (sparse_keymap_entry_from_scancode(priv->input, scancode)) in acpi_fujitsu_laptop_notify()
1035 acpi_handle_info(device->handle, in acpi_fujitsu_laptop_notify()
1040 * First seen on the Skylake-based Lifebook E736/E746/E756), the in acpi_fujitsu_laptop_notify()
1045 if (priv->flags_supported & (FLAG_SOFTKEYS)) { in acpi_fujitsu_laptop_notify()
1049 sparse_keymap_report_event(priv->input, BIT(i), 1, true); in acpi_fujitsu_laptop_notify()
1140 MODULE_PARM_DESC(use_alt_lcd_levels, "Interface used for setting LCD brightness level (-1 = auto, 0…
1142 MODULE_PARM_DESC(disable_brightness_adjust, "Disable LCD brightness adjustment");