vsprintf: reuse almost identical simple_strtoulX() functions
[safe/jmp/linux-2.6] / drivers / acpi / ec.c
index 3fcb913..75b147f 100644 (file)
@@ -120,6 +120,7 @@ static struct acpi_ec {
 
 static int EC_FLAGS_MSI; /* Out-of-spec MSI controller */
 static int EC_FLAGS_VALIDATE_ECDT; /* ASUStec ECDTs need to be validated */
+static int EC_FLAGS_SKIP_DSDT_SCAN; /* Not all BIOS survive early DSDT scan */
 
 /* --------------------------------------------------------------------------
                              Transaction Management
@@ -233,10 +234,8 @@ static int ec_poll(struct acpi_ec *ec)
                        }
                        advance_transaction(ec, acpi_ec_read_status(ec));
                } while (time_before(jiffies, delay));
-               if (!ec->curr->irq_count ||
-                   (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF))
+               if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF)
                        break;
-               /* try restart command if we get any false interrupts */
                pr_debug(PREFIX "controller reset, restart transaction\n");
                spin_lock_irqsave(&ec->curr_lock, flags);
                start_transaction(ec);
@@ -821,7 +820,7 @@ static int acpi_ec_add(struct acpi_device *device)
 
        /* Find and register all query methods */
        acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
-                           acpi_ec_register_query_methods, ec, NULL);
+                           acpi_ec_register_query_methods, NULL, ec, NULL);
 
        if (!first_ec)
                first_ec = ec;
@@ -900,6 +899,13 @@ static const struct acpi_device_id ec_device_ids[] = {
        {"", 0},
 };
 
+/* Some BIOS do not survive early DSDT scan, skip it */
+static int ec_skip_dsdt_scan(const struct dmi_system_id *id)
+{
+       EC_FLAGS_SKIP_DSDT_SCAN = 1;
+       return 0;
+}
+
 /* ASUStek often supplies us with broken ECDT, validate it */
 static int ec_validate_ecdt(const struct dmi_system_id *id)
 {
@@ -917,6 +923,10 @@ static int ec_flag_msi(const struct dmi_system_id *id)
 
 static struct dmi_system_id __initdata ec_dmi_table[] = {
        {
+       ec_skip_dsdt_scan, "Compal JFL92", {
+       DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
+       DMI_MATCH(DMI_BOARD_NAME, "JFL92") }, NULL},
+       {
        ec_flag_msi, "MSI hardware", {
        DMI_MATCH(DMI_BIOS_VENDOR, "Micro-Star"),
        DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star") }, NULL},
@@ -959,6 +969,9 @@ int __init acpi_ec_ecdt_probe(void)
        /* fall through */
        }
 
+       if (EC_FLAGS_SKIP_DSDT_SCAN)
+               return -ENODEV;
+
        /* This workaround is needed only on some broken machines,
         * which require early EC, but fail to provide ECDT */
        printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");