diff options
| author | Daniel Drake <dsd@laptop.org> | 2012-04-12 18:18:24 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2012-05-07 15:02:25 +0200 | 
| commit | d2aa37411b8e65d57d2c5ae36f0222274292020d (patch) | |
| tree | 56e60548d64155edc7a2fa48be85be574aabc762 /arch/x86/platform/olpc/olpc-xo1-sci.c | |
| parent | 83125a3a189ec34fb22a04e8efad69ae6d52674a (diff) | |
| download | olio-linux-3.10-d2aa37411b8e65d57d2c5ae36f0222274292020d.tar.xz olio-linux-3.10-d2aa37411b8e65d57d2c5ae36f0222274292020d.zip  | |
x86/olpc/xo1/sci: Produce wakeup events for buttons and switches
Produce wakeup events for the XO-1's power button, lid switch
and ebook switch, taking care to only produce events when the
states have changed.
Signed-off-by: Daniel Drake <dsd@laptop.org>
Cc: dilinger@queued.net
Cc: pgf@laptop.org
Link: http://lkml.kernel.org/r/20120412171824.D14C49D401E@zog.reactivated.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/platform/olpc/olpc-xo1-sci.c')
| -rw-r--r-- | arch/x86/platform/olpc/olpc-xo1-sci.c | 26 | 
1 files changed, 21 insertions, 5 deletions
diff --git a/arch/x86/platform/olpc/olpc-xo1-sci.c b/arch/x86/platform/olpc/olpc-xo1-sci.c index 1d4c783d732..4b93ff46cec 100644 --- a/arch/x86/platform/olpc/olpc-xo1-sci.c +++ b/arch/x86/platform/olpc/olpc-xo1-sci.c @@ -18,6 +18,7 @@  #include <linux/interrupt.h>  #include <linux/platform_device.h>  #include <linux/pm.h> +#include <linux/pm_wakeup.h>  #include <linux/mfd/core.h>  #include <linux/power_supply.h>  #include <linux/suspend.h> @@ -83,8 +84,12 @@ static void send_ebook_state(void)  		return;  	} +	if (!!test_bit(SW_TABLET_MODE, ebook_switch_idev->sw) == state) +		return; /* Nothing new to report. */ +  	input_report_switch(ebook_switch_idev, SW_TABLET_MODE, state);  	input_sync(ebook_switch_idev); +	pm_wakeup_event(&ebook_switch_idev->dev, 0);  }  static void flip_lid_inverter(void) @@ -123,8 +128,12 @@ static void detect_lid_state(void)  /* Report current lid switch state through input layer */  static void send_lid_state(void)  { +	if (!!test_bit(SW_LID, lid_switch_idev->sw) == !lid_open) +		return; /* Nothing new to report. */ +  	input_report_switch(lid_switch_idev, SW_LID, !lid_open);  	input_sync(lid_switch_idev); +	pm_wakeup_event(&lid_switch_idev->dev, 0);  }  static ssize_t lid_wake_mode_show(struct device *dev, @@ -213,11 +222,18 @@ static irqreturn_t xo1_sci_intr(int irq, void *dev_id)  	dev_dbg(&pdev->dev, "sts %x gpe %x\n", sts, gpe); -	if (sts & CS5536_PWRBTN_FLAG && !(sts & CS5536_WAK_FLAG)) { -		input_report_key(power_button_idev, KEY_POWER, 1); -		input_sync(power_button_idev); -		input_report_key(power_button_idev, KEY_POWER, 0); -		input_sync(power_button_idev); +	if (sts & CS5536_PWRBTN_FLAG) { +		if (!(sts & CS5536_WAK_FLAG)) { +			/* Only report power button input when it was pressed +			 * during regular operation (as opposed to when it +			 * was used to wake the system). */ +			input_report_key(power_button_idev, KEY_POWER, 1); +			input_sync(power_button_idev); +			input_report_key(power_button_idev, KEY_POWER, 0); +			input_sync(power_button_idev); +		} +		/* Report the wakeup event in all cases. */ +		pm_wakeup_event(&power_button_idev->dev, 0);  	}  	if (gpe & CS5536_GPIOM7_PME_FLAG) { /* EC GPIO */  |