aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorCorentin Chary <corentincj@iksaif.net>2009-06-25 13:25:41 +0200
committerLen Brown <len.brown@intel.com>2009-06-26 00:23:41 -0400
commitdbfa3ba90dfe353a56e107cff5bce9fb7976f06f (patch)
tree224ffb0b8cf4507208e6f54953256c0c031bf06a /drivers/platform
parentf36509e7248631671d02f48d1a88f56cdeb54ed8 (diff)
downloadkernel_samsung_aries-dbfa3ba90dfe353a56e107cff5bce9fb7976f06f.zip
kernel_samsung_aries-dbfa3ba90dfe353a56e107cff5bce9fb7976f06f.tar.gz
kernel_samsung_aries-dbfa3ba90dfe353a56e107cff5bce9fb7976f06f.tar.bz2
eeepc-laptop: get the right value for CMSG
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>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/eeepc-laptop.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c
index 19cc9ae..f5d8473 100644
--- a/drivers/platform/x86/eeepc-laptop.c
+++ b/drivers/platform/x86/eeepc-laptop.c
@@ -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);
}