Lines Matching +full:long +full:- +full:press +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
4 * (C) 2004 Hiroshi Miura <miura@da-cha.org>
8 * (C) 2006-2008 Harald Welte <[email protected]>
10 * derived from toshiba_acpi.c, Copyright (C) 2002-2004 John Belmonte
12 *---------------------------------------------------------------------------
16 * -v0.98 add platform devices for firmware brightness registers
17 * add support for battery charging threshold (eco mode)
25 * -v0.97 add support for cdpower hardware switch
26 * -v0.96 merge Lucina's enhancement
28 * - add support for optical driver power in
32 * -v0.95 rename driver from drivers/acpi/pcc_acpi.c to
33 * drivers/misc/panasonic-laptop.c
36 * -v0.94 replace /proc interface with device attributes
40 * -v0.92 merge with 2.6.26-rc6 input API changes
48 * -v0.91 merge with 2.6.24-rc6 ACPI changes
50 * Nov.04, 2006 Hiroshi Miura <miura@da-cha.org>
51 * -v0.9 remove warning about section reference.
56 * - Added screen brightness setting interface
60 * May.29, 2006 Hiroshi Miura <miura@da-cha.org>
61 * -v0.8.4 follow to change keyinput structure
62 * thanks Fabian Yamaguchi <[email protected]-berlin.de>,
66 * Oct.02, 2004 Hiroshi Miura <miura@da-cha.org>
67 * -v0.8.2 merge code of YOKOTA Hiroshi
69 * Add sticky key mode interface.
72 * Sep.15, 2004 Hiroshi Miura <miura@da-cha.org>
73 * -v0.8 Generate key input event on input subsystem.
77 * Sep.10, 2004 Hiroshi Miura <miura@da-cha.org>
78 * -v0.7 Change proc interface functions using seq_file
81 * Aug.28, 2004 Hiroshi Miura <miura@da-cha.org>
82 * -v0.6.4 Fix a silly error with status checking
84 * Aug.25, 2004 Hiroshi Miura <miura@da-cha.org>
85 * -v0.6.3 replace read_acpi_int by standard function
92 * -v0.6.2 Add check on ACPI data (num_sifr)
94 * Fixed an off-by-one error in memory allocation
97 * -v0.6.1 Fix a silly error with status checking
100 * - v0.6 Correct brightness controls to reflect reality
104 * Aug.10, 2004 Hiroshi Miura <miura@da-cha.org>
105 * - v0.5 support LCD brightness control
108 * Jul.25, 2004 Hiroshi Miura <miura@da-cha.org>
109 * - v0.4 first post version
112 * Jul.24, 2004 Hiroshi Miura <miura@da-cha.org>
113 * - v0.3 get proper status of hotkey
115 * Jul.22, 2004 Hiroshi Miura <miura@da-cha.org>
116 * - v0.2 add HotKey handler
118 * Jul.17, 2004 Hiroshi Miura <miura@da-cha.org>
119 * - v0.1 start from toshiba_acpi driver written by John Belmonte
129 #include <linux/input/sparse-keymap.h>
140 MODULE_AUTHOR("Hiroshi Miura <miura@da-cha.org>");
167 /* LCD_TYPEs: 0 = Normal, 1 = Semi-transparent
244 unsigned long num_sifr;
277 case 0x20: /* e0 20 / e0 a0, Volume Mute press / release */ in panasonic_i8042_filter()
278 case 0x2e: /* e0 2e / e0 ae, Volume Down press / release */ in panasonic_i8042_filter()
279 case 0x30: /* e0 30 / e0 b0, Volume Up press / release */ in panasonic_i8042_filter()
284 * with the next non-filtered byte. in panasonic_i8042_filter()
309 status = acpi_evaluate_object(pcc->handle, METHOD_HKEY_SSET, in acpi_pcc_write_sset()
312 return (status == AE_OK) ? 0 : -EIO; in acpi_pcc_write_sset()
317 unsigned long long s; in acpi_pcc_get_sqty()
320 status = acpi_evaluate_integer(device->handle, METHOD_HKEY_SQTY, in acpi_pcc_get_sqty()
326 return -EINVAL; in acpi_pcc_get_sqty()
337 status = acpi_evaluate_object(pcc->handle, METHOD_HKEY_SINF, NULL, in acpi_pcc_retrieve_biosdata()
345 if (!hkey || (hkey->type != ACPI_TYPE_PACKAGE)) { in acpi_pcc_retrieve_biosdata()
351 if (pcc->num_sifr < hkey->package.count) { in acpi_pcc_retrieve_biosdata()
352 pr_err("SQTY reports bad SINF length SQTY: %lu SINF-pkg-count: %u\n", in acpi_pcc_retrieve_biosdata()
353 pcc->num_sifr, hkey->package.count); in acpi_pcc_retrieve_biosdata()
358 for (i = 0; i < hkey->package.count; i++) { in acpi_pcc_retrieve_biosdata()
359 union acpi_object *element = &(hkey->package.elements[i]); in acpi_pcc_retrieve_biosdata()
360 if (likely(element->type == ACPI_TYPE_INTEGER)) { in acpi_pcc_retrieve_biosdata()
361 pcc->sinf[i] = element->integer.value; in acpi_pcc_retrieve_biosdata()
365 pcc->sinf[hkey->package.count] = -1; in acpi_pcc_retrieve_biosdata()
384 return -EIO; in bl_get()
386 return pcc->sinf[SINF_AC_CUR_BRIGHT]; in bl_get()
392 int bright = bd->props.brightness; in bl_set_status()
396 return -EIO; in bl_set_status()
398 if (bright < pcc->sinf[SINF_AC_MIN_BRIGHT]) in bl_set_status()
399 bright = pcc->sinf[SINF_AC_MIN_BRIGHT]; in bl_set_status()
401 if (bright < pcc->sinf[SINF_DC_MIN_BRIGHT]) in bl_set_status()
402 bright = pcc->sinf[SINF_DC_MIN_BRIGHT]; in bl_set_status()
404 if (bright < pcc->sinf[SINF_AC_MIN_BRIGHT] || in bl_set_status()
405 bright > pcc->sinf[SINF_AC_MAX_BRIGHT]) in bl_set_status()
406 return -EINVAL; in bl_set_status()
447 unsigned long long state; in get_optd_power_state()
453 result = -EIO; in get_optd_power_state()
464 result = -EIO; in get_optd_power_state()
493 result = -EIO; in set_optd_power_state()
500 result = -EIO; in set_optd_power_state()
504 result = -EINVAL; in set_optd_power_state()
522 return -EIO; in numbatt_show()
524 return sysfs_emit(buf, "%u\n", pcc->sinf[SINF_NUM_BATTERIES]); in numbatt_show()
534 return -EIO; in lcdtype_show()
536 return sysfs_emit(buf, "%u\n", pcc->sinf[SINF_LCD_TYPE]); in lcdtype_show()
546 return -EIO; in mute_show()
548 return sysfs_emit(buf, "%u\n", pcc->sinf[SINF_MUTE]); in mute_show()
563 pcc->mute = val; in mute_store()
576 return -EIO; in sticky_key_show()
578 return sysfs_emit(buf, "%u\n", pcc->sticky_key); in sticky_key_show()
593 pcc->sticky_key = val; in sticky_key_store()
607 return -EIO; in eco_mode_show()
609 switch (pcc->sinf[SINF_ECO_MODE]) { in eco_mode_show()
617 return -EIO; in eco_mode_show()
646 pcc->sinf[SINF_ECO_MODE] = 0; in eco_mode_store()
647 pcc->eco_mode = 0; in eco_mode_store()
651 pcc->sinf[SINF_ECO_MODE] = 1; in eco_mode_store()
652 pcc->eco_mode = 1; in eco_mode_store()
663 return -EINVAL; in eco_mode_store()
676 return -EIO; in ac_brightness_show()
678 return sysfs_emit(buf, "%u\n", pcc->sinf[SINF_AC_CUR_BRIGHT]); in ac_brightness_show()
693 pcc->ac_brightness = val; in ac_brightness_store()
706 return -EIO; in dc_brightness_show()
708 return sysfs_emit(buf, "%u\n", pcc->sinf[SINF_DC_CUR_BRIGHT]); in dc_brightness_show()
723 pcc->dc_brightness = val; in dc_brightness_store()
736 return -EIO; in current_brightness_show()
738 return sysfs_emit(buf, "%u\n", pcc->sinf[SINF_CUR_BRIGHT]); in current_brightness_show()
754 pcc->current_brightness = val; in current_brightness_store()
800 return (pcc->num_sifr > SINF_MUTE) ? attr->mode : 0; in pcc_sysfs_is_visible()
803 return (pcc->num_sifr > SINF_ECO_MODE) ? attr->mode : 0; in pcc_sysfs_is_visible()
806 return (pcc->num_sifr > SINF_CUR_BRIGHT) ? attr->mode : 0; in pcc_sysfs_is_visible()
808 return attr->mode; in pcc_sysfs_is_visible()
836 struct input_dev *hotk_input_dev = pcc->input_dev; in acpi_pcc_generate_keyinput()
838 unsigned long long result; in acpi_pcc_generate_keyinput()
842 rc = acpi_evaluate_integer(pcc->handle, METHOD_HKEY_QUERY, in acpi_pcc_generate_keyinput()
862 * Don't report brightness key-presses if they are also reported in acpi_pcc_generate_keyinput()
908 return -ENODEV; in pcc_register_optd_notifier()
937 return -ENOMEM; in acpi_pcc_init_input()
939 input_dev->name = ACPI_PCC_DRIVER_NAME; in acpi_pcc_init_input()
940 input_dev->phys = ACPI_PCC_INPUT_PHYS; in acpi_pcc_init_input()
941 input_dev->id.bustype = BUS_HOST; in acpi_pcc_init_input()
942 input_dev->id.vendor = 0x0001; in acpi_pcc_init_input()
943 input_dev->id.product = 0x0001; in acpi_pcc_init_input()
944 input_dev->id.version = 0x0100; in acpi_pcc_init_input()
958 pcc->input_dev = input_dev; in acpi_pcc_init_input()
974 return -EINVAL; in acpi_pcc_hotkey_resume()
978 return -EINVAL; in acpi_pcc_hotkey_resume()
980 if (pcc->num_sifr > SINF_MUTE) in acpi_pcc_hotkey_resume()
981 acpi_pcc_write_sset(pcc, SINF_MUTE, pcc->mute); in acpi_pcc_hotkey_resume()
982 if (pcc->num_sifr > SINF_ECO_MODE) in acpi_pcc_hotkey_resume()
983 acpi_pcc_write_sset(pcc, SINF_ECO_MODE, pcc->eco_mode); in acpi_pcc_hotkey_resume()
984 acpi_pcc_write_sset(pcc, SINF_STICKY_KEY, pcc->sticky_key); in acpi_pcc_hotkey_resume()
985 acpi_pcc_write_sset(pcc, SINF_AC_CUR_BRIGHT, pcc->ac_brightness); in acpi_pcc_hotkey_resume()
986 acpi_pcc_write_sset(pcc, SINF_DC_CUR_BRIGHT, pcc->dc_brightness); in acpi_pcc_hotkey_resume()
987 if (pcc->num_sifr > SINF_CUR_BRIGHT) in acpi_pcc_hotkey_resume()
988 acpi_pcc_write_sset(pcc, SINF_CUR_BRIGHT, pcc->current_brightness); in acpi_pcc_hotkey_resume()
1001 return -EINVAL; in acpi_pcc_hotkey_add()
1006 * pcc->sinf is expected to at least have the AC+DC brightness entries. in acpi_pcc_hotkey_add()
1010 pr_err("num_sifr %d out of range %d - 255\n", num_sifr, SINF_DC_CUR_BRIGHT + 1); in acpi_pcc_hotkey_add()
1011 return -ENODEV; in acpi_pcc_hotkey_add()
1015 * Some DSDT-s have an off-by-one bug where the SINF package count is in acpi_pcc_hotkey_add()
1023 return -ENOMEM; in acpi_pcc_hotkey_add()
1026 pcc->sinf = kcalloc(num_sifr + 1, sizeof(u32), GFP_KERNEL); in acpi_pcc_hotkey_add()
1027 if (!pcc->sinf) { in acpi_pcc_hotkey_add()
1028 result = -ENOMEM; in acpi_pcc_hotkey_add()
1032 pcc->device = device; in acpi_pcc_hotkey_add()
1033 pcc->handle = device->handle; in acpi_pcc_hotkey_add()
1034 pcc->num_sifr = num_sifr; in acpi_pcc_hotkey_add()
1035 device->driver_data = pcc; in acpi_pcc_hotkey_add()
1046 result = -EIO; in acpi_pcc_hotkey_add()
1055 props.max_brightness = pcc->sinf[SINF_AC_MAX_BRIGHT]; in acpi_pcc_hotkey_add()
1057 pcc->backlight = backlight_device_register("panasonic", NULL, pcc, in acpi_pcc_hotkey_add()
1059 if (IS_ERR(pcc->backlight)) { in acpi_pcc_hotkey_add()
1060 result = PTR_ERR(pcc->backlight); in acpi_pcc_hotkey_add()
1065 pcc->backlight->props.brightness = pcc->sinf[SINF_AC_CUR_BRIGHT]; in acpi_pcc_hotkey_add()
1068 /* Reset initial sticky key mode since the hardware register state is not consistent */ in acpi_pcc_hotkey_add()
1070 pcc->sticky_key = 0; in acpi_pcc_hotkey_add()
1072 pcc->ac_brightness = pcc->sinf[SINF_AC_CUR_BRIGHT]; in acpi_pcc_hotkey_add()
1073 pcc->dc_brightness = pcc->sinf[SINF_DC_CUR_BRIGHT]; in acpi_pcc_hotkey_add()
1074 if (pcc->num_sifr > SINF_MUTE) in acpi_pcc_hotkey_add()
1075 pcc->mute = pcc->sinf[SINF_MUTE]; in acpi_pcc_hotkey_add()
1076 if (pcc->num_sifr > SINF_ECO_MODE) in acpi_pcc_hotkey_add()
1077 pcc->eco_mode = pcc->sinf[SINF_ECO_MODE]; in acpi_pcc_hotkey_add()
1078 if (pcc->num_sifr > SINF_CUR_BRIGHT) in acpi_pcc_hotkey_add()
1079 pcc->current_brightness = pcc->sinf[SINF_CUR_BRIGHT]; in acpi_pcc_hotkey_add()
1082 result = sysfs_create_group(&device->dev.kobj, &pcc_attr_group); in acpi_pcc_hotkey_add()
1088 pcc->platform = platform_device_register_simple("panasonic", in acpi_pcc_hotkey_add()
1090 if (IS_ERR(pcc->platform)) { in acpi_pcc_hotkey_add()
1091 result = PTR_ERR(pcc->platform); in acpi_pcc_hotkey_add()
1094 result = device_create_file(&pcc->platform->dev, in acpi_pcc_hotkey_add()
1100 pcc->platform = NULL; in acpi_pcc_hotkey_add()
1107 platform_device_unregister(pcc->platform); in acpi_pcc_hotkey_add()
1109 backlight_device_unregister(pcc->backlight); in acpi_pcc_hotkey_add()
1111 input_unregister_device(pcc->input_dev); in acpi_pcc_hotkey_add()
1113 kfree(pcc->sinf); in acpi_pcc_hotkey_add()
1129 if (pcc->platform) { in acpi_pcc_hotkey_remove()
1130 device_remove_file(&pcc->platform->dev, &dev_attr_cdpower); in acpi_pcc_hotkey_remove()
1131 platform_device_unregister(pcc->platform); in acpi_pcc_hotkey_remove()
1135 sysfs_remove_group(&device->dev.kobj, &pcc_attr_group); in acpi_pcc_hotkey_remove()
1137 backlight_device_unregister(pcc->backlight); in acpi_pcc_hotkey_remove()
1139 input_unregister_device(pcc->input_dev); in acpi_pcc_hotkey_remove()
1141 kfree(pcc->sinf); in acpi_pcc_hotkey_remove()