Lines Matching +full:fn +full:- +full:keymap
1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/input/sparse-keymap.h>
26 #define HWMI_METHOD_GUID "ABBC0F5B-8EA1-11D1-A000-C90629100000"
27 #define HWMI_EVENT_GUID "ABBC0F5C-8EA1-11D1-A000-C90629100000"
30 #define WMI0_EXPENSIVE_GUID "39142400-C6A3-40fa-BADB-8A2652834100"
31 #define WMI0_EVENT_GUID "59142400-C6A3-40fa-BADB-8A2652834100"
92 static int battery_reset = -1;
93 static int report_brightness = -1;
97 "Reset battery charge values to (0-0) before disabling it using (0-100)");
106 quirks = dmi->driver_data; in dmi_matched()
125 .ident = "Huawei MACH-WX9",
128 DMI_MATCH(DMI_PRODUCT_NAME, "MACH-WX9"),
151 mutex_lock(&huawei->wmi_lock); in huawei_wmi_call()
153 mutex_unlock(&huawei->wmi_lock); in huawei_wmi_call()
155 dev_err(huawei->dev, "Failed to evaluate wmi method\n"); in huawei_wmi_call()
156 return -ENODEV; in huawei_wmi_call()
167 * the return status is non-zero, we return -ENODEV but still copy the returned
183 * HWMI and if we get a non-zero return status we evaluate it again. in huawei_wmi_cmd()
192 err = -EIO; in huawei_wmi_cmd()
196 switch (obj->type) { in huawei_wmi_cmd()
201 if (obj->buffer.length == 0x104) { in huawei_wmi_cmd()
203 obj->buffer.pointer += 4; in huawei_wmi_cmd()
206 dev_err(huawei->dev, "Bad buffer length, got %d\n", obj->buffer.length); in huawei_wmi_cmd()
207 err = -EIO; in huawei_wmi_cmd()
216 if (obj->package.count != 2) { in huawei_wmi_cmd()
217 dev_err(huawei->dev, "Bad package count, got %d\n", obj->package.count); in huawei_wmi_cmd()
218 err = -EIO; in huawei_wmi_cmd()
222 obj = &obj->package.elements[1]; in huawei_wmi_cmd()
223 if (obj->type != ACPI_TYPE_BUFFER) { in huawei_wmi_cmd()
224 dev_err(huawei->dev, "Bad package element type, got %d\n", obj->type); in huawei_wmi_cmd()
225 err = -EIO; in huawei_wmi_cmd()
228 len = obj->buffer.length; in huawei_wmi_cmd()
233 dev_err(huawei->dev, "Unexpected obj type, got: %d\n", obj->type); in huawei_wmi_cmd()
234 err = -EIO; in huawei_wmi_cmd()
238 if (!*obj->buffer.pointer) in huawei_wmi_cmd()
242 err = (*obj->buffer.pointer) ? -ENODEV : 0; in huawei_wmi_cmd()
246 memcpy(buf, obj->buffer.pointer, len); in huawei_wmi_cmd()
260 if (quirks && quirks->ec_micmute) { in huawei_wmi_micmute_led_set()
272 return -ENODEV; in huawei_wmi_micmute_led_set()
286 return -ENODEV; in huawei_wmi_micmute_led_set()
291 return -ENODEV; in huawei_wmi_micmute_led_set()
308 huawei->cdev.name = "platform::micmute"; in huawei_wmi_leds_setup()
309 huawei->cdev.max_brightness = 1; in huawei_wmi_leds_setup()
310 huawei->cdev.brightness_set_blocking = &huawei_wmi_micmute_led_set; in huawei_wmi_leds_setup()
311 huawei->cdev.default_trigger = "audio-micmute"; in huawei_wmi_leds_setup()
312 huawei->cdev.brightness = ledtrig_audio_get(LED_AUDIO_MICMUTE); in huawei_wmi_leds_setup()
313 huawei->cdev.dev = dev; in huawei_wmi_leds_setup()
314 huawei->cdev.flags = LED_CORE_SUSPENDRESUME; in huawei_wmi_leds_setup()
316 devm_led_classdev_register(dev, &huawei->cdev); in huawei_wmi_leds_setup()
330 /* Find the last two non-zero values. Return status is ignored. */ in huawei_wmi_battery_get()
334 *start = ret[i-1]; in huawei_wmi_battery_get()
337 } while (i > 2 && !ret[i--]); in huawei_wmi_battery_get()
348 return -EINVAL; in huawei_wmi_battery_set()
359 if (quirks && quirks->battery_reset && start == 0 && end == 100) { in huawei_wmi_battery_set()
422 return -EINVAL; in charge_control_start_threshold_store()
442 return -EINVAL; in charge_control_end_threshold_store()
458 return -EINVAL; in charge_control_thresholds_store()
473 device_create_file(&battery->dev, &dev_attr_charge_control_start_threshold); in huawei_wmi_battery_add()
474 device_create_file(&battery->dev, &dev_attr_charge_control_end_threshold); in huawei_wmi_battery_add()
481 device_remove_file(&battery->dev, &dev_attr_charge_control_start_threshold); in huawei_wmi_battery_remove()
482 device_remove_file(&battery->dev, &dev_attr_charge_control_end_threshold); in huawei_wmi_battery_remove()
497 huawei->battery_available = true; in huawei_wmi_battery_setup()
499 huawei->battery_available = false; in huawei_wmi_battery_setup()
511 if (huawei->battery_available) { in huawei_wmi_battery_exit()
517 /* Fn lock */
528 /* Find the first non-zero value. Return status is ignored. */ in huawei_wmi_fn_lock_get()
532 *on = ret[i] - 1; // -1 undefined, 0 off, 1 on. in huawei_wmi_fn_lock_get()
569 return -EINVAL; in fn_lock_state_store()
584 huawei->fn_lock_available = true; in huawei_wmi_fn_lock_setup()
586 huawei->fn_lock_available = false; in huawei_wmi_fn_lock_setup()
597 if (huawei->fn_lock_available) in huawei_wmi_fn_lock_exit()
606 struct huawei_wmi *huawei = m->private; in huawei_wmi_debugfs_call_dump()
609 switch (obj->type) { in huawei_wmi_debugfs_call_dump()
611 seq_printf(m, "0x%llx", obj->integer.value); in huawei_wmi_debugfs_call_dump()
614 seq_printf(m, "\"%.*s\"", obj->string.length, obj->string.pointer); in huawei_wmi_debugfs_call_dump()
618 for (i = 0; i < obj->buffer.length; i++) { in huawei_wmi_debugfs_call_dump()
619 seq_printf(m, "0x%02x", obj->buffer.pointer[i]); in huawei_wmi_debugfs_call_dump()
620 if (i < obj->buffer.length - 1) in huawei_wmi_debugfs_call_dump()
627 for (i = 0; i < obj->package.count; i++) { in huawei_wmi_debugfs_call_dump()
628 huawei_wmi_debugfs_call_dump(m, huawei, &obj->package.elements[i]); in huawei_wmi_debugfs_call_dump()
629 if (i < obj->package.count - 1) in huawei_wmi_debugfs_call_dump()
635 dev_err(huawei->dev, "Unexpected obj type, got %d\n", obj->type); in huawei_wmi_debugfs_call_dump()
642 struct huawei_wmi *huawei = m->private; in huawei_wmi_debugfs_call_show()
649 in.pointer = &huawei->debug.arg; in huawei_wmi_debugfs_call_show()
657 err = -EIO; in huawei_wmi_debugfs_call_show()
674 huawei->debug.root = debugfs_create_dir("huawei-wmi", NULL); in huawei_wmi_debugfs_setup()
676 debugfs_create_x64("arg", 0644, huawei->debug.root, in huawei_wmi_debugfs_setup()
677 &huawei->debug.arg); in huawei_wmi_debugfs_setup()
679 huawei->debug.root, huawei, &huawei_wmi_debugfs_call_fops); in huawei_wmi_debugfs_setup()
686 debugfs_remove_recursive(huawei->debug.root); in huawei_wmi_debugfs_exit()
710 if (obj && obj->type == ACPI_TYPE_INTEGER) in huawei_wmi_process_key()
711 code = obj->integer.value; in huawei_wmi_process_key()
718 dev_info(&idev->dev, "Unknown key pressed, code: 0x%04x\n", code); in huawei_wmi_process_key()
722 if (quirks && !quirks->report_brightness && in huawei_wmi_process_key()
723 (key->sw.code == KEY_BRIGHTNESSDOWN || in huawei_wmi_process_key()
724 key->sw.code == KEY_BRIGHTNESSUP)) in huawei_wmi_process_key()
739 dev_err(&idev->dev, "Unable to get event data\n"); in huawei_wmi_input_notify()
744 if (obj && obj->type == ACPI_TYPE_INTEGER) in huawei_wmi_input_notify()
745 huawei_wmi_process_key(idev, obj->integer.value); in huawei_wmi_input_notify()
747 dev_err(&idev->dev, "Bad response type\n"); in huawei_wmi_input_notify()
758 return -ENOMEM; in huawei_wmi_input_setup()
760 (*idev)->name = "Huawei WMI hotkeys"; in huawei_wmi_input_setup()
761 (*idev)->phys = "wmi/input0"; in huawei_wmi_input_setup()
762 (*idev)->id.bustype = BUS_HOST; in huawei_wmi_input_setup()
763 (*idev)->dev.parent = dev; in huawei_wmi_input_setup()
790 huawei_wmi->dev = &pdev->dev; in huawei_wmi_probe()
792 while (*guid->guid_string) { in huawei_wmi_probe()
793 struct input_dev *idev = *huawei_wmi->idev; in huawei_wmi_probe()
795 if (wmi_has_guid(guid->guid_string)) { in huawei_wmi_probe()
796 err = huawei_wmi_input_setup(&pdev->dev, guid->guid_string, &idev); in huawei_wmi_probe()
798 dev_err(&pdev->dev, "Failed to setup input on %s\n", guid->guid_string); in huawei_wmi_probe()
808 mutex_init(&huawei_wmi->wmi_lock); in huawei_wmi_probe()
810 huawei_wmi_leds_setup(&pdev->dev); in huawei_wmi_probe()
811 huawei_wmi_fn_lock_setup(&pdev->dev); in huawei_wmi_probe()
812 huawei_wmi_battery_setup(&pdev->dev); in huawei_wmi_probe()
813 huawei_wmi_debugfs_setup(&pdev->dev); in huawei_wmi_probe()
823 while (*guid->guid_string) { in huawei_wmi_remove()
824 if (wmi_has_guid(guid->guid_string)) in huawei_wmi_remove()
825 huawei_wmi_input_exit(&pdev->dev, guid->guid_string); in huawei_wmi_remove()
831 huawei_wmi_debugfs_exit(&pdev->dev); in huawei_wmi_remove()
832 huawei_wmi_battery_exit(&pdev->dev); in huawei_wmi_remove()
833 huawei_wmi_fn_lock_exit(&pdev->dev); in huawei_wmi_remove()
841 .name = "huawei-wmi",
854 return -ENOMEM; in huawei_wmi_init()
858 if (battery_reset != -1) in huawei_wmi_init()
859 quirks->battery_reset = battery_reset; in huawei_wmi_init()
860 if (report_brightness != -1) in huawei_wmi_init()
861 quirks->report_brightness = report_brightness; in huawei_wmi_init()
867 pdev = platform_device_register_simple("huawei-wmi", -1, NULL, 0); in huawei_wmi_init()
884 struct platform_device *pdev = to_platform_device(huawei_wmi->dev); in huawei_wmi_exit()