Lines Matching +full:ec +full:- +full:pwm
1 // SPDX-License-Identifier: GPL-2.0+
14 #include <linux/hwmon-sysfs.h>
64 // Array of keyboard LED colors in 24-bit RGB format
82 handle = acpi_device_handle(data->acpi_dev); in system76_get()
86 return -ENODEV; in system76_get()
103 handle = acpi_device_handle(data->acpi_dev); in system76_get_index()
107 return -ENODEV; in system76_get_index()
117 handle = acpi_device_handle(data->acpi_dev); in system76_get_object()
124 return -ENODEV; in system76_get_object()
130 if (obj && obj->type == ACPI_TYPE_PACKAGE && index <= obj->package.count) { in system76_name()
131 if (obj->package.elements[index].type == ACPI_TYPE_STRING) in system76_name()
132 return obj->package.elements[index].string.pointer; in system76_name()
150 handle = acpi_device_handle(data->acpi_dev); in system76_set()
155 return -1; in system76_set()
175 return -ENODEV; in battery_get_threshold()
185 return -EIO; in battery_get_threshold()
187 return -EINVAL; in battery_get_threshold()
203 return -ENODEV; in battery_set_threshold()
210 return -EINVAL; in battery_set_threshold()
223 return -EIO; in battery_set_threshold()
266 // System76 EC only supports 1 battery in system76_battery_add()
267 if (strcmp(battery->desc->name, "BAT0") != 0) in system76_battery_add()
268 return -ENODEV; in system76_battery_add()
270 if (device_add_groups(&battery->dev, system76_battery_groups)) in system76_battery_add()
271 return -ENODEV; in system76_battery_add()
278 device_remove_groups(&battery->dev, system76_battery_groups); in system76_battery_remove()
327 return data->kb_brightness; in kb_led_get()
336 data->kb_brightness = value; in kb_led_set()
337 if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) { in kb_led_set()
338 return system76_set(data, "SKBB", (int)data->kb_brightness); in kb_led_set()
340 return system76_set(data, "SKBL", (int)data->kb_brightness); in kb_led_set()
355 return sysfs_emit(buf, "%06X\n", data->kb_color); in kb_led_color_show()
376 return -EINVAL; in kb_led_color_store()
377 data->kb_color = (int)val; in kb_led_color_store()
378 system76_set(data, "SKBC", data->kb_color); in kb_led_color_store()
403 &data->kb_led, in kb_led_notify()
404 data->kb_brightness in kb_led_notify()
413 if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) { in kb_led_hotkey_hardware()
421 data->kb_brightness = value; in kb_led_hotkey_hardware()
428 if (data->kb_brightness > 0) { in kb_led_hotkey_toggle()
429 data->kb_toggle_brightness = data->kb_brightness; in kb_led_hotkey_toggle()
430 kb_led_set(&data->kb_led, 0); in kb_led_hotkey_toggle()
432 kb_led_set(&data->kb_led, data->kb_toggle_brightness); in kb_led_hotkey_toggle()
442 if (data->kb_brightness > 0) { in kb_led_hotkey_down()
443 for (i = ARRAY_SIZE(kb_levels); i > 0; i--) { in kb_led_hotkey_down()
444 if (kb_levels[i - 1] < data->kb_brightness) { in kb_led_hotkey_down()
445 kb_led_set(&data->kb_led, kb_levels[i - 1]); in kb_led_hotkey_down()
450 kb_led_set(&data->kb_led, data->kb_toggle_brightness); in kb_led_hotkey_down()
460 if (data->kb_brightness > 0) { in kb_led_hotkey_up()
462 if (kb_levels[i] > data->kb_brightness) { in kb_led_hotkey_up()
463 kb_led_set(&data->kb_led, kb_levels[i]); in kb_led_hotkey_up()
468 kb_led_set(&data->kb_led, data->kb_toggle_brightness); in kb_led_hotkey_up()
478 if (data->kbled_type != KBLED_RGB) in kb_led_hotkey_color()
481 if (data->kb_brightness > 0) { in kb_led_hotkey_color()
483 if (kb_colors[i] == data->kb_color) in kb_led_hotkey_color()
489 data->kb_color = kb_colors[i]; in kb_led_hotkey_color()
490 system76_set(data, "SKBC", data->kb_color); in kb_led_hotkey_color()
492 kb_led_set(&data->kb_led, data->kb_toggle_brightness); in kb_led_hotkey_color()
505 if (system76_name(data->nfan, channel)) in thermal_is_visible()
510 if (system76_name(data->ntmp, channel)) in thermal_is_visible()
559 return -EOPNOTSUPP; in thermal_read()
562 return -EOPNOTSUPP; in thermal_read()
573 *str = system76_name(data->nfan, channel); in thermal_read_string()
581 *str = system76_name(data->ntmp, channel); in thermal_read_string()
588 return -EOPNOTSUPP; in thermal_read_string()
591 return -EOPNOTSUPP; in thermal_read_string()
611 HWMON_CHANNEL_INFO(pwm,
639 input_report_key(data->input, code, 1); in input_key()
640 input_sync(data->input); in input_key()
642 input_report_key(data->input, code, 0); in input_key()
643 input_sync(data->input); in input_key()
680 data = devm_kzalloc(&acpi_dev->dev, sizeof(*data), GFP_KERNEL); in system76_add()
682 return -ENOMEM; in system76_add()
683 acpi_dev->driver_data = data; in system76_add()
684 data->acpi_dev = acpi_dev; in system76_add()
686 // Some models do not run open EC firmware. Check for an ACPI method in system76_add()
687 // that only exists on open EC to guard functionality specific to it. in system76_add()
688 data->has_open_ec = acpi_has_method(acpi_device_handle(data->acpi_dev), "NFAN"); in system76_add()
693 data->ap_led.name = "system76_acpi::airplane"; in system76_add()
694 data->ap_led.flags = LED_CORE_SUSPENDRESUME; in system76_add()
695 data->ap_led.brightness_get = ap_led_get; in system76_add()
696 data->ap_led.brightness_set_blocking = ap_led_set; in system76_add()
697 data->ap_led.max_brightness = 1; in system76_add()
698 data->ap_led.default_trigger = "rfkill-none"; in system76_add()
699 err = devm_led_classdev_register(&acpi_dev->dev, &data->ap_led); in system76_add()
703 data->kb_led.name = "system76_acpi::kbd_backlight"; in system76_add()
704 data->kb_led.flags = LED_BRIGHT_HW_CHANGED | LED_CORE_SUSPENDRESUME; in system76_add()
705 data->kb_led.brightness_get = kb_led_get; in system76_add()
706 data->kb_led.brightness_set_blocking = kb_led_set; in system76_add()
707 if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) { in system76_add()
709 data->kbled_type = system76_get(data, "GKBK"); in system76_add()
711 switch (data->kbled_type) { in system76_add()
716 data->kb_led.max_brightness = 255; in system76_add()
717 data->kb_toggle_brightness = 72; in system76_add()
720 data->kb_led.max_brightness = 255; in system76_add()
721 data->kb_led.groups = system76_kb_led_color_groups; in system76_add()
722 data->kb_toggle_brightness = 72; in system76_add()
723 data->kb_color = 0xffffff; in system76_add()
724 system76_set(data, "SKBC", data->kb_color); in system76_add()
729 if (acpi_has_method(acpi_device_handle(data->acpi_dev), "SKBC")) { in system76_add()
730 data->kbled_type = KBLED_RGB; in system76_add()
731 data->kb_led.max_brightness = 255; in system76_add()
732 data->kb_led.groups = system76_kb_led_color_groups; in system76_add()
733 data->kb_toggle_brightness = 72; in system76_add()
734 data->kb_color = 0xffffff; in system76_add()
735 system76_set(data, "SKBC", data->kb_color); in system76_add()
737 data->kbled_type = KBLED_WHITE; in system76_add()
738 data->kb_led.max_brightness = 5; in system76_add()
742 if (data->kbled_type != KBLED_NONE) { in system76_add()
743 err = devm_led_classdev_register(&acpi_dev->dev, &data->kb_led); in system76_add()
748 data->input = devm_input_allocate_device(&acpi_dev->dev); in system76_add()
749 if (!data->input) in system76_add()
750 return -ENOMEM; in system76_add()
752 data->input->name = "System76 ACPI Hotkeys"; in system76_add()
753 data->input->phys = "system76_acpi/input0"; in system76_add()
754 data->input->id.bustype = BUS_HOST; in system76_add()
755 data->input->dev.parent = &acpi_dev->dev; in system76_add()
756 input_set_capability(data->input, EV_KEY, KEY_SCREENLOCK); in system76_add()
758 err = input_register_device(data->input); in system76_add()
762 if (data->has_open_ec) { in system76_add()
763 err = system76_get_object(data, "NFAN", &data->nfan); in system76_add()
767 err = system76_get_object(data, "NTMP", &data->ntmp); in system76_add()
771 data->therm = devm_hwmon_device_register_with_info(&acpi_dev->dev, in system76_add()
773 err = PTR_ERR_OR_ZERO(data->therm); in system76_add()
783 if (data->has_open_ec) { in system76_add()
784 kfree(data->ntmp); in system76_add()
785 kfree(data->nfan); in system76_add()
797 if (data->has_open_ec) { in system76_remove()
799 kfree(data->nfan); in system76_remove()
800 kfree(data->ntmp); in system76_remove()
803 devm_led_classdev_unregister(&acpi_dev->dev, &data->ap_led); in system76_remove()
804 devm_led_classdev_unregister(&acpi_dev->dev, &data->kb_led); in system76_remove()