|
@@ -47,6 +47,10 @@
|
|
|
#define CFG_WIFI_BIT (18)
|
|
|
#define CFG_CAMERA_BIT (19)
|
|
|
|
|
|
+#if IS_ENABLED(CONFIG_ACPI_WMI)
|
|
|
+static const char ideapad_wmi_fnesc_event[] = "26CAB2E5-5CF1-46AE-AAC3-4A12B6BA50E6";
|
|
|
+#endif
|
|
|
+
|
|
|
enum {
|
|
|
VPCCMD_R_VPC1 = 0x10,
|
|
|
VPCCMD_R_BL_MAX,
|
|
@@ -567,6 +571,8 @@ static const struct key_entry ideapad_keymap[] = {
|
|
|
{ KE_KEY, 65, { KEY_PROG4 } },
|
|
|
{ KE_KEY, 66, { KEY_TOUCHPAD_OFF } },
|
|
|
{ KE_KEY, 67, { KEY_TOUCHPAD_ON } },
|
|
|
+ { KE_KEY, 128, { KEY_ESC } },
|
|
|
+
|
|
|
{ KE_END, 0 },
|
|
|
};
|
|
|
|
|
@@ -825,6 +831,19 @@ static void ideapad_acpi_notify(acpi_handle handle, u32 event, void *data)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if IS_ENABLED(CONFIG_ACPI_WMI)
|
|
|
+static void ideapad_wmi_notify(u32 value, void *context)
|
|
|
+{
|
|
|
+ switch (value) {
|
|
|
+ case 128:
|
|
|
+ ideapad_input_report(context, value);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ pr_info("Unknown WMI event %u\n", value);
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Some ideapads don't have a hardware rfkill switch, reading VPCCMD_R_RF
|
|
|
* always results in 0 on these models, causing ideapad_laptop to wrongly
|
|
@@ -853,24 +872,31 @@ static const struct dmi_system_id no_hw_rfkill_list[] = {
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- .ident = "Lenovo Yoga 3 14",
|
|
|
+ .ident = "Lenovo Yoga 2 11 / 13 / Pro",
|
|
|
.matches = {
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
- DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Yoga 3 14"),
|
|
|
+ DMI_MATCH(DMI_BOARD_NAME, "Yoga2"),
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- .ident = "Lenovo Yoga 2 11 / 13 / Pro",
|
|
|
+ .ident = "Lenovo Yoga 3 1170 / 1470",
|
|
|
.matches = {
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
- DMI_MATCH(DMI_BOARD_NAME, "Yoga2"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Yoga 3"),
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
.ident = "Lenovo Yoga 3 Pro 1370",
|
|
|
.matches = {
|
|
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
- DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 3 Pro-1370"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 3"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .ident = "Lenovo Yoga 900",
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 900"),
|
|
|
},
|
|
|
},
|
|
|
{}
|
|
@@ -935,8 +961,18 @@ static int ideapad_acpi_add(struct platform_device *pdev)
|
|
|
ACPI_DEVICE_NOTIFY, ideapad_acpi_notify, priv);
|
|
|
if (ret)
|
|
|
goto notification_failed;
|
|
|
+#if IS_ENABLED(CONFIG_ACPI_WMI)
|
|
|
+ ret = wmi_install_notify_handler(ideapad_wmi_fnesc_event, ideapad_wmi_notify, priv);
|
|
|
+ if (ret != AE_OK && ret != AE_NOT_EXIST)
|
|
|
+ goto notification_failed_wmi;
|
|
|
+#endif
|
|
|
|
|
|
return 0;
|
|
|
+#if IS_ENABLED(CONFIG_ACPI_WMI)
|
|
|
+notification_failed_wmi:
|
|
|
+ acpi_remove_notify_handler(priv->adev->handle,
|
|
|
+ ACPI_DEVICE_NOTIFY, ideapad_acpi_notify);
|
|
|
+#endif
|
|
|
notification_failed:
|
|
|
ideapad_backlight_exit(priv);
|
|
|
backlight_failed:
|
|
@@ -955,6 +991,9 @@ static int ideapad_acpi_remove(struct platform_device *pdev)
|
|
|
struct ideapad_private *priv = dev_get_drvdata(&pdev->dev);
|
|
|
int i;
|
|
|
|
|
|
+#if IS_ENABLED(CONFIG_ACPI_WMI)
|
|
|
+ wmi_remove_notify_handler(ideapad_wmi_fnesc_event);
|
|
|
+#endif
|
|
|
acpi_remove_notify_handler(priv->adev->handle,
|
|
|
ACPI_DEVICE_NOTIFY, ideapad_acpi_notify);
|
|
|
ideapad_backlight_exit(priv);
|