]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/acpi/ec.c
ACPI: EC: Add some basic check for ECDT data
[karo-tx-linux.git] / drivers / acpi / ec.c
index 2694998f6999b63b62c8a494feb1ddae255fc479..5d8a76a4c8bdfc5e38072f31910dfbe6bc4166ed 100644 (file)
@@ -968,7 +968,6 @@ static const struct acpi_device_id ec_device_ids[] = {
 
 int __init acpi_ec_ecdt_probe(void)
 {
-       int ret;
        acpi_status status;
        struct acpi_table_ecdt *ecdt_ptr;
 
@@ -996,30 +995,32 @@ int __init acpi_ec_ecdt_probe(void)
                boot_ec->gpe = ecdt_ptr->gpe;
                boot_ec->handle = ACPI_ROOT_OBJECT;
                acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
-       } else {
-               /* This workaround is needed only on some broken machines,
-                * which require early EC, but fail to provide ECDT */
-               acpi_handle x;
-               printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
-               status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
-                                               boot_ec, NULL);
-               /* Check that acpi_get_devices actually find something */
-               if (ACPI_FAILURE(status) || !boot_ec->handle)
-                       goto error;
-               /* We really need to limit this workaround, the only ASUS,
-                * which needs it, has fake EC._INI method, so use it as flag.
-                * Keep boot_ec struct as it will be needed soon.
-                */
-               if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
-                       return -ENODEV;
+               /* Add some basic check against completely broken table */
+               if (boot_ec->data_addr != boot_ec->command_addr)
+                       goto install;
+       /* fall through */
        }
-
-       ret = ec_install_handlers(boot_ec);
-       if (!ret) {
+       /* This workaround is needed only on some broken machines,
+        * which require early EC, but fail to provide ECDT */
+       acpi_handle x;
+       printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
+       status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
+                                       boot_ec, NULL);
+       /* Check that acpi_get_devices actually find something */
+       if (ACPI_FAILURE(status) || !boot_ec->handle)
+               goto error;
+       /* We really need to limit this workaround, the only ASUS,
+        * which needs it, has fake EC._INI method, so use it as flag.
+        * Keep boot_ec struct as it will be needed soon.
+        */
+       if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
+               return -ENODEV;
+install:
+       if (!ec_install_handlers(boot_ec)) {
                first_ec = boot_ec;
                return 0;
        }
-      error:
+error:
        kfree(boot_ec);
        boot_ec = NULL;
        return -ENODEV;