Lines Matching +full:fn +full:- +full:keymap

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ideapad-laptop.c - Lenovo IdeaPad ACPI Extras
24 #include <linux/input/sparse-keymap.h>
37 #include "ideapad-laptop.h"
42 #include <dt-bindings/leds/common.h>
122 * These correspond to the number of supported states - 1
204 "Enable DYTC version 4 platform-profile support. "
205 "If you need this please report this to: platform-driver-x86@vger.kernel.org");
211 "If you need this please report this to: platform-driver-x86@vger.kernel.org");
216 "Enable driver based updates of the fn-lock LED on fn-lock changes. "
217 "If you need this please report this to: platform-driver-x86@vger.kernel.org");
222 "Enable driver based PS/2 aux port en-/dis-abling on touchpad on/off toggle. "
223 "If you need this please report this to: platform-driver-x86@vger.kernel.org");
228 "Enable registering a 'touchpad' sysfs-attribute which can be used to manually "
234 "Enable EC triggering work-around to force emitting tablet mode events. "
235 "If you need this please report this to: platform-driver-x86@vger.kernel.org");
254 dev_warn(&priv->adev->dev, "found multiple platform devices\n"); in ideapad_shared_init()
255 ret = -EINVAL; in ideapad_shared_init()
295 return -EIO; in eval_int()
317 return -EIO; in eval_int_with_arg()
329 return ACPI_FAILURE(status) ? -EIO : 0; in exec_simple_method()
387 return -EIO; in eval_vpcw()
416 return -ETIMEDOUT; in read_ec_data()
447 return -ETIMEDOUT; in write_ec_cmd()
455 struct ideapad_private *priv = s->private; in debugfs_status_show()
458 guard(mutex)(&priv->vpc_mutex); in debugfs_status_show()
460 if (!read_ec_data(priv->adev->handle, VPCCMD_R_BL_MAX, &value)) in debugfs_status_show()
462 if (!read_ec_data(priv->adev->handle, VPCCMD_R_BL, &value)) in debugfs_status_show()
464 if (!read_ec_data(priv->adev->handle, VPCCMD_R_BL_POWER, &value)) in debugfs_status_show()
469 if (!read_ec_data(priv->adev->handle, VPCCMD_R_RF, &value)) in debugfs_status_show()
471 if (!read_ec_data(priv->adev->handle, VPCCMD_R_WIFI, &value)) in debugfs_status_show()
473 if (!read_ec_data(priv->adev->handle, VPCCMD_R_BT, &value)) in debugfs_status_show()
475 if (!read_ec_data(priv->adev->handle, VPCCMD_R_3G, &value)) in debugfs_status_show()
480 if (!read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value)) in debugfs_status_show()
482 if (!read_ec_data(priv->adev->handle, VPCCMD_R_CAMERA, &value)) in debugfs_status_show()
487 if (!eval_gbmd(priv->adev->handle, &value)) in debugfs_status_show()
489 if (!eval_hals(priv->adev->handle, &value)) in debugfs_status_show()
498 struct ideapad_private *priv = s->private; in debugfs_cfg_show()
500 seq_printf(s, "_CFG: %#010lx\n\n", priv->cfg); in debugfs_cfg_show()
503 if (test_bit(CFG_CAP_BT_BIT, &priv->cfg)) in debugfs_cfg_show()
505 if (test_bit(CFG_CAP_3G_BIT, &priv->cfg)) in debugfs_cfg_show()
507 if (test_bit(CFG_CAP_WIFI_BIT, &priv->cfg)) in debugfs_cfg_show()
509 if (test_bit(CFG_CAP_CAM_BIT, &priv->cfg)) in debugfs_cfg_show()
514 if (test_bit(CFG_OSD_NUMLK_BIT, &priv->cfg)) in debugfs_cfg_show()
515 seq_puts(s, " num-lock"); in debugfs_cfg_show()
516 if (test_bit(CFG_OSD_CAPSLK_BIT, &priv->cfg)) in debugfs_cfg_show()
517 seq_puts(s, " caps-lock"); in debugfs_cfg_show()
518 if (test_bit(CFG_OSD_MICMUTE_BIT, &priv->cfg)) in debugfs_cfg_show()
519 seq_puts(s, " mic-mute"); in debugfs_cfg_show()
520 if (test_bit(CFG_OSD_TOUCHPAD_BIT, &priv->cfg)) in debugfs_cfg_show()
522 if (test_bit(CFG_OSD_CAM_BIT, &priv->cfg)) in debugfs_cfg_show()
527 switch (priv->cfg & 0x700) { in debugfs_cfg_show()
555 priv->debug = dir; in ideapad_debugfs_init()
563 debugfs_remove_recursive(priv->debug); in ideapad_debugfs_exit()
564 priv->debug = NULL; in ideapad_debugfs_exit()
578 scoped_guard(mutex, &priv->vpc_mutex) { in camera_power_show()
579 err = read_ec_data(priv->adev->handle, VPCCMD_R_CAMERA, &result); in camera_power_show()
599 scoped_guard(mutex, &priv->vpc_mutex) { in camera_power_store()
600 err = write_ec_cmd(priv->adev->handle, VPCCMD_W_CAMERA, state); in camera_power_store()
625 err = eval_gbmd(priv->adev->handle, &result); in conservation_mode_show()
646 err = exec_sbmc(priv->adev->handle, state ? SBMC_CONSERVATION_ON : SBMC_CONSERVATION_OFF); in conservation_mode_store()
663 scoped_guard(mutex, &priv->vpc_mutex) { in fan_mode_show()
664 err = read_ec_data(priv->adev->handle, VPCCMD_R_FAN, &result); in fan_mode_show()
685 return -EINVAL; in fan_mode_store()
687 scoped_guard(mutex, &priv->vpc_mutex) { in fan_mode_store()
688 err = write_ec_cmd(priv->adev->handle, VPCCMD_W_FAN, state); in fan_mode_store()
703 err = eval_hals(priv->adev->handle, &hals); in ideapad_fn_lock_get()
712 return exec_sals(priv->adev->handle, in ideapad_fn_lock_set()
718 if (!priv->fn_lock.initialized) in ideapad_fn_lock_led_notify()
721 if (brightness == priv->fn_lock.last_brightness) in ideapad_fn_lock_led_notify()
724 priv->fn_lock.last_brightness = brightness; in ideapad_fn_lock_led_notify()
726 led_classdev_notify_brightness_hw_changed(&priv->fn_lock.led, brightness); in ideapad_fn_lock_led_notify()
774 scoped_guard(mutex, &priv->vpc_mutex) { in touchpad_show()
775 err = read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &result); in touchpad_show()
780 priv->r_touchpad_val = result; in touchpad_show()
797 scoped_guard(mutex, &priv->vpc_mutex) { in touchpad_store()
798 err = write_ec_cmd(priv->adev->handle, VPCCMD_W_TOUCHPAD, state); in touchpad_store()
803 priv->r_touchpad_val = state; in touchpad_store()
818 err = eval_hals(priv->adev->handle, &hals); in usb_charging_show()
837 err = exec_sals(priv->adev->handle, state ? SALS_USB_CHARGING_ON : SALS_USB_CHARGING_OFF); in usb_charging_store()
865 supported = test_bit(CFG_CAP_CAM_BIT, &priv->cfg); in ideapad_is_visible()
867 supported = priv->features.conservation_mode; in ideapad_is_visible()
869 supported = priv->features.fan_mode; in ideapad_is_visible()
871 supported = priv->features.fn_lock; in ideapad_is_visible()
873 supported = priv->features.touchpad_ctrl_via_ec; in ideapad_is_visible()
875 supported = priv->features.usb_charging; in ideapad_is_visible()
877 return supported ? attr->mode : 0; in ideapad_is_visible()
889 #define DYTC_CMD_QUERY 0 /* To get DYTC status - enable/revision */
894 #define DYTC_QUERY_ENABLE_BIT 8 /* Bit 8 - 0 = disabled, 1 = enabled */
895 #define DYTC_QUERY_SUBREV_BIT 16 /* Bits 16 - 27 - sub revision */
896 #define DYTC_QUERY_REV_BIT 28 /* Bits 28 - 31 - revision */
898 #define DYTC_GET_FUNCTION_BIT 8 /* Bits 8-11 - function setting */
899 #define DYTC_GET_MODE_BIT 12 /* Bits 12-15 - mode setting */
901 #define DYTC_SET_FUNCTION_BIT 12 /* Bits 12-15 - function setting */
902 #define DYTC_SET_MODE_BIT 16 /* Bits 16-19 - mode setting */
903 #define DYTC_SET_VALID_BIT 20 /* Bit 20 - 1 = on, 0 = off */
935 return -EINVAL; in convert_dytc_to_profile()
954 return -EOPNOTSUPP; in convert_profile_to_dytc()
969 *profile = dytc->current_profile; in dytc_profile_get()
974 * Helper function - check if we are in CQL mode and if we are
975 * - disable CQL,
976 * - run the command
977 * - enable CQL
986 err = eval_dytc(priv->adev->handle, DYTC_CMD_GET, output); in dytc_cql_command()
996 err = eval_dytc(priv->adev->handle, DYTC_DISABLE_CQL, NULL); in dytc_cql_command()
1001 cmd_err = eval_dytc(priv->adev->handle, cmd, output); in dytc_cql_command()
1005 err = eval_dytc(priv->adev->handle, DYTC_ENABLE_CQL, NULL); in dytc_cql_command()
1021 struct ideapad_private *priv = dytc->priv; in dytc_profile_set()
1025 scoped_guard(mutex_intr, &dytc->mutex) { in dytc_profile_set()
1028 err = eval_dytc(priv->adev->handle, DYTC_CMD_RESET, NULL); in dytc_profile_set()
1046 /* Success - update current profile */ in dytc_profile_set()
1047 dytc->current_profile = profile; in dytc_profile_set()
1051 return -EINTR; in dytc_profile_set()
1069 scoped_guard(mutex, &priv->dytc->mutex) in dytc_profile_refresh()
1079 if (profile != priv->dytc->current_profile) { in dytc_profile_refresh()
1080 priv->dytc->current_profile = profile; in dytc_profile_refresh()
1081 platform_profile_notify(priv->dytc->ppdev); in dytc_profile_refresh()
1114 if (!priv->features.dytc) in ideapad_dytc_profile_init()
1115 return -ENODEV; in ideapad_dytc_profile_init()
1117 err = eval_dytc(priv->adev->handle, DYTC_CMD_QUERY, &output); in ideapad_dytc_profile_init()
1124 dev_info(&priv->platform_device->dev, "DYTC_QUERY_ENABLE_BIT returned false\n"); in ideapad_dytc_profile_init()
1125 return -ENODEV; in ideapad_dytc_profile_init()
1131 dev_info(&priv->platform_device->dev, "DYTC_VERSION < 4 is not supported\n"); in ideapad_dytc_profile_init()
1132 return -ENODEV; in ideapad_dytc_profile_init()
1137 dev_info(&priv->platform_device->dev, in ideapad_dytc_profile_init()
1139 return -ENODEV; in ideapad_dytc_profile_init()
1142 priv->dytc = kzalloc(sizeof(*priv->dytc), GFP_KERNEL); in ideapad_dytc_profile_init()
1143 if (!priv->dytc) in ideapad_dytc_profile_init()
1144 return -ENOMEM; in ideapad_dytc_profile_init()
1146 mutex_init(&priv->dytc->mutex); in ideapad_dytc_profile_init()
1148 priv->dytc->priv = priv; in ideapad_dytc_profile_init()
1151 priv->dytc->ppdev = devm_platform_profile_register(&priv->platform_device->dev, in ideapad_dytc_profile_init()
1152 "ideapad-laptop", priv->dytc, in ideapad_dytc_profile_init()
1154 if (IS_ERR(priv->dytc->ppdev)) { in ideapad_dytc_profile_init()
1155 err = PTR_ERR(priv->dytc->ppdev); in ideapad_dytc_profile_init()
1165 mutex_destroy(&priv->dytc->mutex); in ideapad_dytc_profile_init()
1166 kfree(priv->dytc); in ideapad_dytc_profile_init()
1167 priv->dytc = NULL; in ideapad_dytc_profile_init()
1174 if (!priv->dytc) in ideapad_dytc_profile_exit()
1177 mutex_destroy(&priv->dytc->mutex); in ideapad_dytc_profile_exit()
1178 kfree(priv->dytc); in ideapad_dytc_profile_exit()
1180 priv->dytc = NULL; in ideapad_dytc_profile_exit()
1202 int opcode = ideapad_rfk_data[priv->dev].opcode; in ideapad_rfk_set()
1204 guard(mutex)(&priv->priv->vpc_mutex); in ideapad_rfk_set()
1206 return write_ec_cmd(priv->priv->adev->handle, opcode, !blocked); in ideapad_rfk_set()
1218 if (priv->features.hw_rfkill_switch) { in ideapad_sync_rfk_state()
1219 guard(mutex)(&priv->vpc_mutex); in ideapad_sync_rfk_state()
1221 if (read_ec_data(priv->adev->handle, VPCCMD_R_RF, &hw_blocked)) in ideapad_sync_rfk_state()
1227 if (priv->rfk[i]) in ideapad_sync_rfk_state()
1228 rfkill_set_hw_state(priv->rfk[i], hw_blocked); in ideapad_sync_rfk_state()
1238 write_ec_cmd(priv->adev->handle, ideapad_rfk_data[dev].opcode, 1); in ideapad_register_rfkill()
1242 priv->rfk_priv[dev].dev = dev; in ideapad_register_rfkill()
1243 priv->rfk_priv[dev].priv = priv; in ideapad_register_rfkill()
1245 priv->rfk[dev] = rfkill_alloc(ideapad_rfk_data[dev].name, in ideapad_register_rfkill()
1246 &priv->platform_device->dev, in ideapad_register_rfkill()
1249 &priv->rfk_priv[dev]); in ideapad_register_rfkill()
1250 if (!priv->rfk[dev]) in ideapad_register_rfkill()
1251 return -ENOMEM; in ideapad_register_rfkill()
1253 err = read_ec_data(priv->adev->handle, ideapad_rfk_data[dev].opcode - 1, &rf_enabled); in ideapad_register_rfkill()
1257 rfkill_init_sw_state(priv->rfk[dev], !rf_enabled); in ideapad_register_rfkill()
1259 err = rfkill_register(priv->rfk[dev]); in ideapad_register_rfkill()
1261 rfkill_destroy(priv->rfk[dev]); in ideapad_register_rfkill()
1268 if (!priv->rfk[dev]) in ideapad_unregister_rfkill()
1271 rfkill_unregister(priv->rfk[dev]); in ideapad_unregister_rfkill()
1272 rfkill_destroy(priv->rfk[dev]); in ideapad_unregister_rfkill()
1309 /* Refresh Rate Toggle (Fn+R) */
1324 /* Star- (User Assignable Key) */
1328 /* Performance toggle also Fn+Q, handled inside ideapad_wmi_notify() */
1345 return -ENOMEM; in ideapad_input_init()
1347 inputdev->name = "Ideapad extra buttons"; in ideapad_input_init()
1348 inputdev->phys = "ideapad/input0"; in ideapad_input_init()
1349 inputdev->id.bustype = BUS_HOST; in ideapad_input_init()
1350 inputdev->dev.parent = &priv->platform_device->dev; in ideapad_input_init()
1354 dev_err(&priv->platform_device->dev, in ideapad_input_init()
1355 "Could not set up input device keymap: %d\n", err); in ideapad_input_init()
1361 dev_err(&priv->platform_device->dev, in ideapad_input_init()
1366 priv->inputdev = inputdev; in ideapad_input_init()
1378 input_unregister_device(priv->inputdev); in ideapad_input_exit()
1379 priv->inputdev = NULL; in ideapad_input_exit()
1385 sparse_keymap_report_event(priv->inputdev, scancode, 1, true); in ideapad_input_report()
1392 scoped_guard(mutex, &priv->vpc_mutex) in ideapad_input_novokey()
1393 if (read_ec_data(priv->adev->handle, VPCCMD_R_NOVO, &long_pressed)) in ideapad_input_novokey()
1406 scoped_guard(mutex, &priv->vpc_mutex) in ideapad_check_special_buttons()
1407 if (read_ec_data(priv->adev->handle, VPCCMD_R_SPECIAL_BUTTONS, &value)) in ideapad_check_special_buttons()
1415 if (priv->dytc) in ideapad_check_special_buttons()
1425 dev_info(&priv->platform_device->dev, in ideapad_check_special_buttons()
1441 guard(mutex)(&priv->vpc_mutex); in ideapad_backlight_get_brightness()
1443 err = read_ec_data(priv->adev->handle, VPCCMD_R_BL, &now); in ideapad_backlight_get_brightness()
1455 guard(mutex)(&priv->vpc_mutex); in ideapad_backlight_update_status()
1457 err = write_ec_cmd(priv->adev->handle, VPCCMD_W_BL, in ideapad_backlight_update_status()
1458 blightdev->props.brightness); in ideapad_backlight_update_status()
1462 err = write_ec_cmd(priv->adev->handle, VPCCMD_W_BL_POWER, in ideapad_backlight_update_status()
1463 blightdev->props.power != BACKLIGHT_POWER_OFF); in ideapad_backlight_update_status()
1482 err = read_ec_data(priv->adev->handle, VPCCMD_R_BL_MAX, &max); in ideapad_backlight_init()
1486 err = read_ec_data(priv->adev->handle, VPCCMD_R_BL, &now); in ideapad_backlight_init()
1490 err = read_ec_data(priv->adev->handle, VPCCMD_R_BL_POWER, &power); in ideapad_backlight_init()
1500 &priv->platform_device->dev, in ideapad_backlight_init()
1506 dev_err(&priv->platform_device->dev, in ideapad_backlight_init()
1511 priv->blightdev = blightdev; in ideapad_backlight_init()
1512 blightdev->props.brightness = now; in ideapad_backlight_init()
1513 blightdev->props.power = power ? BACKLIGHT_POWER_ON : BACKLIGHT_POWER_OFF; in ideapad_backlight_init()
1522 backlight_device_unregister(priv->blightdev); in ideapad_backlight_exit()
1523 priv->blightdev = NULL; in ideapad_backlight_exit()
1528 struct backlight_device *blightdev = priv->blightdev; in ideapad_backlight_notify_power()
1534 guard(mutex)(&priv->vpc_mutex); in ideapad_backlight_notify_power()
1536 if (read_ec_data(priv->adev->handle, VPCCMD_R_BL_POWER, &power)) in ideapad_backlight_notify_power()
1539 blightdev->props.power = power ? BACKLIGHT_POWER_ON : BACKLIGHT_POWER_OFF; in ideapad_backlight_notify_power()
1547 if (!priv->blightdev) in ideapad_backlight_notify_brightness()
1548 scoped_guard(mutex, &priv->vpc_mutex) in ideapad_backlight_notify_brightness()
1549 read_ec_data(priv->adev->handle, VPCCMD_R_BL, &now); in ideapad_backlight_notify_brightness()
1551 backlight_force_update(priv->blightdev, BACKLIGHT_UPDATE_HOTKEY); in ideapad_backlight_notify_brightness()
1567 if (ideapad_kbd_bl_check_tristate(priv->kbd_bl.type)) { in ideapad_kbd_bl_brightness_get()
1568 err = eval_kblc(priv->adev->handle, in ideapad_kbd_bl_brightness_get()
1569 FIELD_PREP(KBD_BL_COMMAND_TYPE, priv->kbd_bl.type) | in ideapad_kbd_bl_brightness_get()
1580 if (value <= priv->kbd_bl.led.max_brightness) in ideapad_kbd_bl_brightness_get()
1584 if (value == priv->kbd_bl.led.max_brightness + 1) in ideapad_kbd_bl_brightness_get()
1588 dev_warn(&priv->platform_device->dev, in ideapad_kbd_bl_brightness_get()
1590 return -EINVAL; in ideapad_kbd_bl_brightness_get()
1593 err = eval_hals(priv->adev->handle, &value); in ideapad_kbd_bl_brightness_get()
1611 int type = priv->kbd_bl.type; in ideapad_kbd_bl_brightness_set()
1614 if (brightness > priv->kbd_bl.led.max_brightness) in ideapad_kbd_bl_brightness_set()
1615 return -EINVAL; in ideapad_kbd_bl_brightness_set()
1620 err = exec_kblc(priv->adev->handle, value); in ideapad_kbd_bl_brightness_set()
1622 err = exec_sals(priv->adev->handle, brightness ? SALS_KBD_BL_ON : SALS_KBD_BL_OFF); in ideapad_kbd_bl_brightness_set()
1628 priv->kbd_bl.last_brightness = brightness; in ideapad_kbd_bl_brightness_set()
1645 if (!priv->kbd_bl.initialized) in ideapad_kbd_bl_notify()
1652 if (brightness == priv->kbd_bl.last_brightness) in ideapad_kbd_bl_notify()
1655 priv->kbd_bl.last_brightness = brightness; in ideapad_kbd_bl_notify()
1657 led_classdev_notify_brightness_hw_changed(&priv->kbd_bl.led, brightness); in ideapad_kbd_bl_notify()
1664 if (!priv->features.kbd_bl) in ideapad_kbd_bl_init()
1665 return -ENODEV; in ideapad_kbd_bl_init()
1667 if (WARN_ON(priv->kbd_bl.initialized)) in ideapad_kbd_bl_init()
1668 return -EEXIST; in ideapad_kbd_bl_init()
1670 if (ideapad_kbd_bl_check_tristate(priv->kbd_bl.type)) { in ideapad_kbd_bl_init()
1671 priv->kbd_bl.led.max_brightness = 2; in ideapad_kbd_bl_init()
1673 priv->kbd_bl.led.max_brightness = 1; in ideapad_kbd_bl_init()
1680 priv->kbd_bl.last_brightness = brightness; in ideapad_kbd_bl_init()
1681 priv->kbd_bl.led.name = "platform::" LED_FUNCTION_KBD_BACKLIGHT; in ideapad_kbd_bl_init()
1682 priv->kbd_bl.led.brightness_get = ideapad_kbd_bl_led_cdev_brightness_get; in ideapad_kbd_bl_init()
1683 priv->kbd_bl.led.brightness_set_blocking = ideapad_kbd_bl_led_cdev_brightness_set; in ideapad_kbd_bl_init()
1684 priv->kbd_bl.led.flags = LED_BRIGHT_HW_CHANGED | LED_RETAIN_AT_SHUTDOWN; in ideapad_kbd_bl_init()
1686 err = led_classdev_register(&priv->platform_device->dev, &priv->kbd_bl.led); in ideapad_kbd_bl_init()
1690 priv->kbd_bl.initialized = true; in ideapad_kbd_bl_init()
1697 if (!priv->kbd_bl.initialized) in ideapad_kbd_bl_exit()
1700 priv->kbd_bl.initialized = false; in ideapad_kbd_bl_exit()
1702 led_classdev_unregister(&priv->kbd_bl.led); in ideapad_kbd_bl_exit()
1727 if (!priv->features.fn_lock) in ideapad_fn_lock_led_init()
1728 return -ENODEV; in ideapad_fn_lock_led_init()
1730 if (WARN_ON(priv->fn_lock.initialized)) in ideapad_fn_lock_led_init()
1731 return -EEXIST; in ideapad_fn_lock_led_init()
1733 priv->fn_lock.led.max_brightness = 1; in ideapad_fn_lock_led_init()
1739 priv->fn_lock.last_brightness = brightness; in ideapad_fn_lock_led_init()
1740 priv->fn_lock.led.name = "platform::" LED_FUNCTION_FNLOCK; in ideapad_fn_lock_led_init()
1741 priv->fn_lock.led.brightness_get = ideapad_fn_lock_led_cdev_get; in ideapad_fn_lock_led_init()
1742 priv->fn_lock.led.brightness_set_blocking = ideapad_fn_lock_led_cdev_set; in ideapad_fn_lock_led_init()
1743 priv->fn_lock.led.flags = LED_BRIGHT_HW_CHANGED | LED_RETAIN_AT_SHUTDOWN; in ideapad_fn_lock_led_init()
1745 err = led_classdev_register(&priv->platform_device->dev, &priv->fn_lock.led); in ideapad_fn_lock_led_init()
1749 priv->fn_lock.initialized = true; in ideapad_fn_lock_led_init()
1756 if (!priv->fn_lock.initialized) in ideapad_fn_lock_led_exit()
1759 priv->fn_lock.initialized = false; in ideapad_fn_lock_led_exit()
1761 led_classdev_unregister(&priv->fn_lock.led); in ideapad_fn_lock_led_exit()
1774 scoped_guard(mutex, &priv->vpc_mutex) in ideapad_sync_touchpad_state()
1775 ret = read_ec_data(priv->adev->handle, VPCCMD_R_TOUCHPAD, &value); in ideapad_sync_touchpad_state()
1780 * Some IdeaPads don't really turn off touchpad - they only in ideapad_sync_touchpad_state()
1785 if (priv->features.ctrl_ps2_aux_port) in ideapad_sync_touchpad_state()
1791 * an acpi-notify with VPC bit 5 set on resume, so this function get in ideapad_sync_touchpad_state()
1795 if (send_events && value != priv->r_touchpad_val) { in ideapad_sync_touchpad_state()
1797 sysfs_notify(&priv->platform_device->dev.kobj, NULL, "touchpad"); in ideapad_sync_touchpad_state()
1800 priv->r_touchpad_val = value; in ideapad_sync_touchpad_state()
1832 if (!priv->features.ymc_ec_trigger) in ideapad_laptop_trigger_ec()
1835 scoped_guard(mutex, &priv->vpc_mutex) in ideapad_laptop_trigger_ec()
1836 ret = write_ec_cmd(priv->adev->handle, VPCCMD_W_YMC, 1); in ideapad_laptop_trigger_ec()
1838 dev_warn(&priv->platform_device->dev, "Could not write YMC: %d\n", ret); in ideapad_laptop_trigger_ec()
1882 scoped_guard(mutex, &priv->vpc_mutex) { in ideapad_acpi_notify()
1903 * This event gets send on a Yoga 300-11IBR when the EC in ideapad_acpi_notify()
1907 * windows service calling a DSM on the DUAL250E ACPI- in ideapad_acpi_notify()
1943 dev_info(&priv->platform_device->dev, in ideapad_acpi_notify()
1970 * switch causing ideapad_laptop to wrongly report all radios as hw-blocked.
1973 * More importantly wrongly reporting the wifi radio as hw-blocked, results in
1974 * non working wifi. Whereas not reporting it hw-blocked, when it actually is
1975 * hw-blocked results in an empty SSID list, which is a much more benign
2011 switch (val->intval) { in ideapad_psy_ext_set_prop()
2013 return exec_sbmc(priv->adev->handle, SBMC_CONSERVATION_ON); in ideapad_psy_ext_set_prop()
2015 return exec_sbmc(priv->adev->handle, SBMC_CONSERVATION_OFF); in ideapad_psy_ext_set_prop()
2017 return -EINVAL; in ideapad_psy_ext_set_prop()
2031 err = eval_gbmd(priv->adev->handle, &result); in ideapad_psy_ext_get_prop()
2036 val->intval = POWER_SUPPLY_CHARGE_TYPE_LONGLIFE; in ideapad_psy_ext_get_prop()
2038 val->intval = POWER_SUPPLY_CHARGE_TYPE_STANDARD; in ideapad_psy_ext_get_prop()
2071 &priv->platform_device->dev, priv); in ideapad_battery_add()
2084 acpi_handle handle = priv->adev->handle; in ideapad_check_features()
2088 priv->features.set_fn_lock_led = in ideapad_check_features()
2090 priv->features.hw_rfkill_switch = in ideapad_check_features()
2092 priv->features.ctrl_ps2_aux_port = in ideapad_check_features()
2094 priv->features.touchpad_ctrl_via_ec = touchpad_ctrl_via_ec; in ideapad_check_features()
2095 priv->features.ymc_ec_trigger = in ideapad_check_features()
2099 priv->features.fan_mode = true; in ideapad_check_features()
2102 priv->features.conservation_mode = true; in ideapad_check_features()
2103 priv->battery_hook.add_battery = ideapad_battery_add; in ideapad_check_features()
2104 priv->battery_hook.remove_battery = ideapad_battery_remove; in ideapad_check_features()
2105 priv->battery_hook.name = "Ideapad Battery Extension"; in ideapad_check_features()
2107 err = devm_battery_hook_register(&priv->platform_device->dev, &priv->battery_hook); in ideapad_check_features()
2113 priv->features.dytc = true; in ideapad_check_features()
2118 priv->features.fn_lock = true; in ideapad_check_features()
2121 priv->features.kbd_bl = true; in ideapad_check_features()
2122 priv->kbd_bl.type = KBD_BL_STANDARD; in ideapad_check_features()
2126 priv->features.usb_charging = true; in ideapad_check_features()
2131 if (!eval_kblc(priv->adev->handle, KBD_BL_QUERY_TYPE, &val)) { in ideapad_check_features()
2133 priv->features.kbd_bl = true; in ideapad_check_features()
2134 priv->kbd_bl.type = KBD_BL_TRISTATE; in ideapad_check_features()
2136 priv->features.kbd_bl = true; in ideapad_check_features()
2137 priv->kbd_bl.type = KBD_BL_TRISTATE_AUTO; in ideapad_check_features()
2139 dev_warn(&priv->platform_device->dev, in ideapad_check_features()
2166 wpriv = devm_kzalloc(&wdev->dev, sizeof(*wpriv), GFP_KERNEL); in ideapad_wmi_probe()
2168 return -ENOMEM; in ideapad_wmi_probe()
2172 dev_set_drvdata(&wdev->dev, wpriv); in ideapad_wmi_probe()
2178 struct ideapad_wmi_private *wpriv = dev_get_drvdata(&wdev->dev); in ideapad_wmi_notify()
2187 switch (wpriv->event) { in ideapad_wmi_notify()
2192 if (priv->features.set_fn_lock_led) { in ideapad_wmi_notify()
2201 if (data->type != ACPI_TYPE_INTEGER) { in ideapad_wmi_notify()
2202 dev_warn(&wdev->dev, in ideapad_wmi_notify()
2207 dev_dbg(&wdev->dev, "WMI fn-key event: 0x%llx\n", in ideapad_wmi_notify()
2208 data->integer.value); in ideapad_wmi_notify()
2211 if (data->integer.value == 0x3d && priv->dytc) { in ideapad_wmi_notify()
2217 if (data->integer.value == 0x02 || data->integer.value == 0x03) in ideapad_wmi_notify()
2218 ideapad_fn_lock_led_notify(priv, data->integer.value == 0x02); in ideapad_wmi_notify()
2221 data->integer.value | IDEAPAD_WMI_KEY); in ideapad_wmi_notify()
2236 { "26CAB2E5-5CF1-46AE-AAC3-4A12B6BA50E6", &ideapad_wmi_context_esc }, /* Yoga 3 */
2237 { "56322276-8493-4CE8-A783-98C991274F5E", &ideapad_wmi_context_esc }, /* Yoga 700 */
2238 { "8FC0DE0C-B4E4-43FD-B0F3-8871711C1294", &ideapad_wmi_context_fn_keys }, /* Legion 5 */
2272 struct acpi_device *adev = ACPI_COMPANION(&pdev->dev); in ideapad_acpi_add()
2278 if (!adev || eval_int(adev->handle, "_CFG", &cfg)) in ideapad_acpi_add()
2279 return -ENODEV; in ideapad_acpi_add()
2281 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in ideapad_acpi_add()
2283 return -ENOMEM; in ideapad_acpi_add()
2285 dev_set_drvdata(&pdev->dev, priv); in ideapad_acpi_add()
2287 priv->cfg = cfg; in ideapad_acpi_add()
2288 priv->adev = adev; in ideapad_acpi_add()
2289 priv->platform_device = pdev; in ideapad_acpi_add()
2291 err = devm_mutex_init(&pdev->dev, &priv->vpc_mutex); in ideapad_acpi_add()
2307 if (err != -ENODEV) in ideapad_acpi_add()
2308 dev_warn(&pdev->dev, "Could not set up keyboard backlight LED: %d\n", err); in ideapad_acpi_add()
2310 dev_info(&pdev->dev, "Keyboard backlight control not available\n"); in ideapad_acpi_add()
2315 if (err != -ENODEV) in ideapad_acpi_add()
2316 dev_warn(&pdev->dev, "Could not set up FnLock LED: %d\n", err); in ideapad_acpi_add()
2318 dev_info(&pdev->dev, "FnLock control not available\n"); in ideapad_acpi_add()
2322 * On some models without a hw-switch (the yoga 2 13 at least) in ideapad_acpi_add()
2325 if (!priv->features.hw_rfkill_switch) in ideapad_acpi_add()
2326 write_ec_cmd(priv->adev->handle, VPCCMD_W_RF, 1); in ideapad_acpi_add()
2329 if (test_bit(ideapad_rfk_data[i].cfgbit, &priv->cfg)) in ideapad_acpi_add()
2337 if (err != -ENODEV) in ideapad_acpi_add()
2338 dev_warn(&pdev->dev, "Could not set up DYTC interface: %d\n", err); in ideapad_acpi_add()
2340 dev_info(&pdev->dev, "DYTC interface is not available\n"); in ideapad_acpi_add()
2345 if (err && err != -ENODEV) in ideapad_acpi_add()
2349 status = acpi_install_notify_handler(adev->handle, in ideapad_acpi_add()
2353 err = -EIO; in ideapad_acpi_add()
2366 acpi_remove_notify_handler(priv->adev->handle, in ideapad_acpi_add()
2391 struct ideapad_private *priv = dev_get_drvdata(&pdev->dev); in ideapad_acpi_remove()
2398 acpi_remove_notify_handler(priv->adev->handle, in ideapad_acpi_remove()
2422 if (priv->dytc) in ideapad_acpi_resume()