|
@@ -553,6 +553,28 @@ static int eeepc_setkeycode(struct input_dev *dev, int scancode, int keycode)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+static void cmsg_quirk(int cm, const char *name)
|
|
|
+{
|
|
|
+ int dummy;
|
|
|
+
|
|
|
+ /* Some BIOSes do not report cm although it is avaliable.
|
|
|
+ Check if cm_getv[cm] works and, if yes, assume cm should be set. */
|
|
|
+ if (!(ehotk->cm_supported & (1 << cm))
|
|
|
+ && !read_acpi_int(ehotk->handle, cm_getv[cm], &dummy)) {
|
|
|
+ pr_info("%s (%x) not reported by BIOS,"
|
|
|
+ " enabling anyway\n", name, 1 << cm);
|
|
|
+ ehotk->cm_supported |= 1 << cm;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void cmsg_quirks(void)
|
|
|
+{
|
|
|
+ cmsg_quirk(CM_ASL_LID, "LID");
|
|
|
+ cmsg_quirk(CM_ASL_TYPE, "TYPE");
|
|
|
+ cmsg_quirk(CM_ASL_PANELPOWER, "PANELPOWER");
|
|
|
+ cmsg_quirk(CM_ASL_TPD, "TPD");
|
|
|
+}
|
|
|
+
|
|
|
static int eeepc_hotk_check(void)
|
|
|
{
|
|
|
const struct key_entry *key;
|
|
@@ -576,6 +598,7 @@ static int eeepc_hotk_check(void)
|
|
|
pr_err("Get control methods supported failed\n");
|
|
|
return -ENODEV;
|
|
|
} else {
|
|
|
+ cmsg_quirks();
|
|
|
pr_info("Get control methods supported: 0x%x\n",
|
|
|
ehotk->cm_supported);
|
|
|
}
|