aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlexey Starikovskiy <astarikovskiy@suse.de>2009-10-02 12:21:40 -0400
committerLen Brown <len.brown@intel.com>2009-10-03 01:23:26 -0400
commit478fa03b32f1b3320aebc482b1685272e17a4762 (patch)
treed00edee8669514f6fee00a35a7c538094cc5ce36 /drivers
parent0adf3c746a73684b3f8c2821a584e1db998f61e9 (diff)
ACPI: EC: Don't parse DSDT for EC early init on Compal
Compal DSDT breaks if scanned early, while we need early scan for almost all ASUS machines. Safest workaround seems to be to continue do an early scan for all machines, but this Compal model. http://bugzilla.kernel.org/show_bug.cgi?id=14086 Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/acpi/ec.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 3fcb9132881e..2c790b5badb3 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -120,6 +120,7 @@ static struct acpi_ec {
120 120
121static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */ 121static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
122static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */ 122static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */
123static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */
123 124
124/* -------------------------------------------------------------------------- 125/* --------------------------------------------------------------------------
125 Transaction Management 126 Transaction Management
@@ -900,6 +901,13 @@ static const struct acpi_device_id ec_device_ids[] = {
900 {"", 0}, 901 {"", 0},
901}; 902};
902 903
904/* Some BIOS do not survive early DSDT scan, skip it */
905static int ec_skip_dsdt_scan(const struct dmi_system_id *id)
906{
907 EC_FLAGS_SKIP_DSDT_SCAN = 1;
908 return 0;
909}
910
903/* ASUStek often supplies us with broken ECDT, validate it */ 911/* ASUStek often supplies us with broken ECDT, validate it */
904static int ec_validate_ecdt(const struct dmi_system_id *id) 912static int ec_validate_ecdt(const struct dmi_system_id *id)
905{ 913{
@@ -917,6 +925,10 @@ static int ec_flag_msi(const struct dmi_system_id *id)
917 925
918static struct dmi_system_id __initdata ec_dmi_table[] = { 926static struct dmi_system_id __initdata ec_dmi_table[] = {
919 { 927 {
928 ec_skip_dsdt_scan, "Compal JFL92", {
929 DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
930 DMI_MATCH(DMI_BOARD_NAME, "JFL92") }, NULL},
931 {
920 ec_flag_msi, "MSI hardware", { 932 ec_flag_msi, "MSI hardware", {
921 DMI_MATCH(DMI_BIOS_VENDOR, "Micro-Star"), 933 DMI_MATCH(DMI_BIOS_VENDOR, "Micro-Star"),
922 DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star") }, NULL}, 934 DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star") }, NULL},
@@ -959,6 +971,9 @@ int __init acpi_ec_ecdt_probe(void)
959 /* fall through */ 971 /* fall through */
960 } 972 }
961 973
974 if (EC_FLAGS_SKIP_DSDT_SCAN)
975 return -ENODEV;
976
962 /* This workaround is needed only on some broken machines, 977 /* This workaround is needed only on some broken machines,
963 * which require early EC, but fail to provide ECDT */ 978 * which require early EC, but fail to provide ECDT */
964 printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n"); 979 printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");