aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorAlexey Starikovskiy <astarikovskiy@suse.de>2009-12-30 07:53:10 -0500
committerLen Brown <len.brown@intel.com>2010-01-15 22:53:04 -0500
commit54070101f86ca9a6e9ba243c999d144721ec3db7 (patch)
tree7642d320afef14bc1e306ff420adb1e834f430c7 /drivers/acpi
parentf5347867c5aea94c625246eaff8f7820b0a4cd8a (diff)
ACPI: EC: Add wait for irq storm
Merge of poll and irq modes accelerated EC transaction, so that keyboard starts to suffer again. Add msleep(1) into transaction path for the storm to allow keyboard controller to do its job. Reference: http://bugzilla.kernel.org/show_bug.cgi?id=14747 Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/ec.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index 047330929821..d6471bb6852f 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -259,7 +259,6 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
259 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); 259 clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
260 spin_unlock_irqrestore(&ec->curr_lock, tmp); 260 spin_unlock_irqrestore(&ec->curr_lock, tmp);
261 ret = ec_poll(ec); 261 ret = ec_poll(ec);
262 pr_debug(PREFIX "transaction end\n");
263 spin_lock_irqsave(&ec->curr_lock, tmp); 262 spin_lock_irqsave(&ec->curr_lock, tmp);
264 ec->curr = NULL; 263 ec->curr = NULL;
265 spin_unlock_irqrestore(&ec->curr_lock, tmp); 264 spin_unlock_irqrestore(&ec->curr_lock, tmp);
@@ -316,6 +315,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
316 /* check if we received SCI during transaction */ 315 /* check if we received SCI during transaction */
317 ec_check_sci_sync(ec, acpi_ec_read_status(ec)); 316 ec_check_sci_sync(ec, acpi_ec_read_status(ec));
318 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { 317 if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
318 msleep(1);
319 /* it is safe to enable GPE outside of transaction */ 319 /* it is safe to enable GPE outside of transaction */
320 acpi_enable_gpe(NULL, ec->gpe); 320 acpi_enable_gpe(NULL, ec->gpe);
321 } else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) { 321 } else if (t->irq_count > ACPI_EC_STORM_THRESHOLD) {
@@ -323,6 +323,7 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
323 "transactions will use polling mode\n"); 323 "transactions will use polling mode\n");
324 set_bit(EC_FLAGS_GPE_STORM, &ec->flags); 324 set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
325 } 325 }
326 pr_debug(PREFIX "transaction end\n");
326end: 327end:
327 if (ec->global_lock) 328 if (ec->global_lock)
328 acpi_release_global_lock(glk); 329 acpi_release_global_lock(glk);