pandora: reserve CMA area for c64_tools
[pandora-kernel.git] / drivers / acpi / ec.c
index fa848c4..d2519b2 100644 (file)
@@ -69,12 +69,8 @@ enum ec_command {
 
 #define ACPI_EC_DELAY          500     /* Wait 500ms max. during EC ops */
 #define ACPI_EC_UDELAY_GLK     1000    /* Wait 1ms max. to get global lock */
-#define ACPI_EC_CDELAY         10      /* Wait 10us before polling EC */
 #define ACPI_EC_MSI_UDELAY     550     /* Wait 550us for MSI EC */
 
-#define ACPI_EC_STORM_THRESHOLD 8      /* number of false interrupts
-                                          per one transaction */
-
 enum {
        EC_FLAGS_QUERY_PENDING,         /* Query is pending */
        EC_FLAGS_GPE_STORM,             /* GPE storm detected */
@@ -88,6 +84,15 @@ static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY;
 module_param(ec_delay, uint, 0644);
 MODULE_PARM_DESC(ec_delay, "Timeout(ms) waited until an EC command completes");
 
+/*
+ * If the number of false interrupts per one transaction exceeds
+ * this threshold, will think there is a GPE storm happened and
+ * will disable the GPE for normal transaction.
+ */
+static unsigned int ec_storm_threshold  __read_mostly = 8;
+module_param(ec_storm_threshold, uint, 0644);
+MODULE_PARM_DESC(ec_storm_threshold, "Maxim false GPE numbers not considered as GPE storm");
+
 /* If we find an EC via the ECDT, we need to keep a ptr to its context */
 /* External interfaces use first EC only, so remember */
 typedef int (*acpi_ec_query_func) (void *data);
@@ -320,7 +325,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
                msleep(1);
                /* It is safe to enable the GPE outside of the transaction. */
                acpi_enable_gpe(NULL, ec->gpe);
-       } else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) {
+       } else if (t->irq_count > ec_storm_threshold) {
                pr_info(PREFIX "GPE storm detected, "
                        "transactions will use polling mode\n");
                set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
@@ -433,8 +438,7 @@ EXPORT_SYMBOL(ec_write);
 
 int ec_transaction(u8 command,
                   const u8 * wdata, unsigned wdata_len,
-                  u8 * rdata, unsigned rdata_len,
-                  int force_poll)
+                  u8 * rdata, unsigned rdata_len)
 {
        struct transaction t = {.command = command,
                                .wdata = wdata, .rdata = rdata,
@@ -592,8 +596,6 @@ static void acpi_ec_gpe_query(void *ec_cxt)
        mutex_unlock(&ec->lock);
 }
 
-static void acpi_ec_gpe_query(void *ec_cxt);
-
 static int ec_check_sci(struct acpi_ec *ec, u8 state)
 {
        if (state & ACPI_EC_FLAG_SCI) {
@@ -808,8 +810,6 @@ static int acpi_ec_add(struct acpi_device *device)
                        return -EINVAL;
        }
 
-       ec->handle = device->handle;
-
        /* Find and register all query methods */
        acpi_walk_namespace(ACPI_TYPE_METHOD, ec->handle, 1,
                            acpi_ec_register_query_methods, NULL, ec, NULL);
@@ -920,6 +920,17 @@ static int ec_flag_msi(const struct dmi_system_id *id)
        return 0;
 }
 
+/*
+ * Clevo M720 notebook actually works ok with IRQ mode, if we lifted
+ * the GPE storm threshold back to 20
+ */
+static int ec_enlarge_storm_threshold(const struct dmi_system_id *id)
+{
+       pr_debug("Setting the EC GPE storm threshold to 20\n");
+       ec_storm_threshold  = 20;
+       return 0;
+}
+
 static struct dmi_system_id __initdata ec_dmi_table[] = {
        {
        ec_skip_dsdt_scan, "Compal JFL92", {
@@ -938,12 +949,26 @@ static struct dmi_system_id __initdata ec_dmi_table[] = {
        ec_flag_msi, "MSI hardware", {
        DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-STAR")}, NULL},
        {
+       ec_flag_msi, "Quanta hardware", {
+       DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
+       DMI_MATCH(DMI_PRODUCT_NAME, "TW8/SW8/DW8"),}, NULL},
+       {
+       ec_flag_msi, "Quanta hardware", {
+       DMI_MATCH(DMI_SYS_VENDOR, "Quanta"),
+       DMI_MATCH(DMI_PRODUCT_NAME, "TW9/SW9"),}, NULL},
+       {
        ec_validate_ecdt, "ASUS hardware", {
        DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL},
+       {
+       ec_validate_ecdt, "ASUS hardware", {
+       DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc.") }, NULL},
+       {
+       ec_enlarge_storm_threshold, "CLEVO hardware", {
+       DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
+       DMI_MATCH(DMI_PRODUCT_NAME, "M720T/M730T"),}, NULL},
        {},
 };
 
-
 int __init acpi_ec_ecdt_probe(void)
 {
        acpi_status status;