eeepc-laptop: get the right value for CMSG
authorCorentin Chary <corentincj@iksaif.net>
Thu, 25 Jun 2009 11:25:41 +0000 (13:25 +0200)
committerLen Brown <len.brown@intel.com>
Fri, 26 Jun 2009 04:23:41 +0000 (00:23 -0400)
CMSG is an ACPI method used to find features available on
an Eee PC. But some features are never repported, even if present.

If the getter of a feature is present, this patch will set
the corresponding bit in cmsg.

Signed-off-by: Corentin Chary <corentincj@iksaif.net>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/platform/x86/eeepc-laptop.c

index 19cc9ae7db5a7077f0b46b26c1c7439e055b2a4a..f5d8473ea66f08f91d9174a0a20c3e19ec32caab 100644 (file)
@@ -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);
                }