aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.24/1305-suppress-onkey-events-on-resume-Was-Re-Where-ar.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.24/1305-suppress-onkey-events-on-resume-Was-Re-Where-ar.patch')
-rw-r--r--target/linux/s3c24xx/patches-2.6.24/1305-suppress-onkey-events-on-resume-Was-Re-Where-ar.patch176
1 files changed, 176 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.24/1305-suppress-onkey-events-on-resume-Was-Re-Where-ar.patch b/target/linux/s3c24xx/patches-2.6.24/1305-suppress-onkey-events-on-resume-Was-Re-Where-ar.patch
new file mode 100644
index 0000000000..174c1c08e5
--- /dev/null
+++ b/target/linux/s3c24xx/patches-2.6.24/1305-suppress-onkey-events-on-resume-Was-Re-Where-ar.patch
@@ -0,0 +1,176 @@
+From 71f219082f5c04a80f9b143fc92a51a3de5c6683 Mon Sep 17 00:00:00 2001
+From: \\\\\\\"Mike (mwester)\\\\\\ <mwester@dls.net>
+Date: Tue, 14 Oct 2008 05:46:34 +0100
+Subject: [PATCH] suppress "onkey" events on resume [Was: Re: Where are actions configured for buttons in FSO?]
+
+Michael 'Mickey' Lauer wrote:
+...
+> The problem is (and this is the reason why I'm crossposting this to the
+> kernel mailing list), the kernel is not swallowing the power button
+> presses that triggers the resume, so you need some "real" programming
+> (as opposed to the expressional complexity of our rules) in order to
+> prevent falling asleep right after resume.
+>
+> Kernel-guys, can we change that?
+
+suppress-resume-onkey-event.patch
+
+This suppresses the key press and key release events from the
+power button, in the case where the power button is the wake
+event for the GTA01 or GTA02 device.
+
+Signed-off-by: Mike Westerhof <mwester@dls.net>
+---
+ drivers/i2c/chips/pcf50606.c | 34 +++++++++++++++++++++++++++++-----
+ drivers/i2c/chips/pcf50633.c | 30 ++++++++++++++++++++++++++----
+ 2 files changed, 55 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/i2c/chips/pcf50606.c b/drivers/i2c/chips/pcf50606.c
+index 18263fb..706ce6d 100644
+--- a/drivers/i2c/chips/pcf50606.c
++++ b/drivers/i2c/chips/pcf50606.c
+@@ -120,6 +120,7 @@ struct pcf50606_data {
+ int onkey_seconds;
+ int irq;
+ int coldplug_done;
++ int suppress_onkey_events;
+ enum pcf50606_suspend_states suspend_state;
+ #ifdef CONFIG_PM
+ struct {
+@@ -656,9 +657,21 @@ static void pcf50606_work(struct work_struct *work)
+ *
+ * pcf50606 resume is really really over now then.
+ */
+- if (pcf->suspend_state != PCF50606_SS_RUNNING)
++ if (pcf->suspend_state != PCF50606_SS_RUNNING) {
+ pcf->suspend_state = PCF50606_SS_RUNNING;
+
++ /* peek at the IRQ reason, if power button then set a flag
++ * so that we do not signal the event to userspace
++ */
++ if (pcfirq[0] & (PCF50606_INT1_ONKEYF | PCF50606_INT1_ONKEYR)) {
++ pcf->suppress_onkey_events = 1;
++ dev_dbg(&pcf->client.dev,
++ "Wake by ONKEY, suppressing ONKEY events");
++ } else {
++ pcf->suppress_onkey_events = 0;
++ }
++ }
++
+ if (!pcf->coldplug_done) {
+ DEBUGPC("PMU Coldplug init\n");
+
+@@ -689,9 +702,13 @@ static void pcf50606_work(struct work_struct *work)
+
+ if (pcfirq[0] & PCF50606_INT1_ONKEYF) {
+ /* ONKEY falling edge (start of button press) */
+- DEBUGPC("ONKEYF ");
+ pcf->flags |= PCF50606_F_PWR_PRESSED;
+- input_report_key(pcf->input_dev, KEY_POWER, 1);
++ if (!pcf->suppress_onkey_events) {
++ DEBUGPC("ONKEYF ");
++ input_report_key(pcf->input_dev, KEY_POWER, 1);
++ } else {
++ DEBUGPC("ONKEYF(unreported) ");
++ }
+ }
+ if (pcfirq[0] & PCF50606_INT1_ONKEY1S) {
+ /* ONKEY pressed for more than 1 second */
+@@ -706,10 +723,16 @@ static void pcf50606_work(struct work_struct *work)
+ }
+ if (pcfirq[0] & PCF50606_INT1_ONKEYR) {
+ /* ONKEY rising edge (end of button press) */
+- DEBUGPC("ONKEYR ");
+ pcf->flags &= ~PCF50606_F_PWR_PRESSED;
+ pcf->onkey_seconds = -1;
+- input_report_key(pcf->input_dev, KEY_POWER, 0);
++ if (!pcf->suppress_onkey_events) {
++ DEBUGPC("ONKEYR ");
++ input_report_key(pcf->input_dev, KEY_POWER, 0);
++ } else {
++ DEBUGPC("ONKEYR(suppressed) ");
++ /* don't suppress any more power button events */
++ pcf->suppress_onkey_events = 0;
++ }
+ /* disable SECOND interrupt in case RTC didn't
+ * request it */
+ if (!(pcf->flags & PCF50606_F_RTC_SECOND))
+@@ -1766,6 +1789,7 @@ static int pcf50606_detect(struct i2c_adapter *adapter, int address, int kind)
+ INIT_WORK(&data->work, pcf50606_work);
+ data->irq = irq;
+ data->working = 0;
++ data->suppress_onkey_events = 0;
+ data->onkey_seconds = -1;
+ data->pdata = pcf50606_pdev->dev.platform_data;
+
+diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c
+index c186fdb..490e34d 100644
+--- a/drivers/i2c/chips/pcf50633.c
++++ b/drivers/i2c/chips/pcf50633.c
+@@ -135,6 +135,7 @@ struct pcf50633_data {
+ int usb_removal_count;
+ u8 pcfirq_resume[5];
+ int probe_completed;
++ int suppress_onkey_events;
+
+ /* if he pulls battery while charging, we notice that and correctly
+ * report that the charger is idle. But there is no interrupt that
+@@ -848,6 +849,16 @@ static void pcf50633_work(struct work_struct *work)
+
+ /* pcf50633 resume is really really over now then */
+ pcf->suspend_state = PCF50633_SS_RUNNING;
++
++ /* peek at the IRQ reason, if power button then set a flag
++ * so that we do not signal the event to userspace
++ */
++ if (pcfirq[1] & (PCF50633_INT2_ONKEYF | PCF50633_INT2_ONKEYR)) {
++ pcf->suppress_onkey_events = 1;
++ DEBUGP("Wake by ONKEY, suppressing ONKEY event");
++ } else {
++ pcf->suppress_onkey_events = 0;
++ }
+ }
+
+ if (!pcf->coldplug_done) {
+@@ -988,16 +999,26 @@ static void pcf50633_work(struct work_struct *work)
+
+ if (pcfirq[1] & PCF50633_INT2_ONKEYF) {
+ /* ONKEY falling edge (start of button press) */
+- DEBUGPC("ONKEYF ");
+ pcf->flags |= PCF50633_F_PWR_PRESSED;
+- input_report_key(pcf->input_dev, KEY_POWER, 1);
++ if (!pcf->suppress_onkey_events) {
++ DEBUGPC("ONKEYF ");
++ input_report_key(pcf->input_dev, KEY_POWER, 1);
++ } else {
++ DEBUGPC("ONKEYF(unreported) ");
++ }
+ }
+ if (pcfirq[1] & PCF50633_INT2_ONKEYR) {
+ /* ONKEY rising edge (end of button press) */
+- DEBUGPC("ONKEYR ");
+ pcf->flags &= ~PCF50633_F_PWR_PRESSED;
+ pcf->onkey_seconds = -1;
+- input_report_key(pcf->input_dev, KEY_POWER, 0);
++ if (!pcf->suppress_onkey_events) {
++ DEBUGPC("ONKEYR ");
++ input_report_key(pcf->input_dev, KEY_POWER, 0);
++ } else {
++ DEBUGPC("ONKEYR(unreported) ");
++ /* don't suppress any more power button events */
++ pcf->suppress_onkey_events = 0;
++ }
+ /* disable SECOND interrupt in case RTC didn't
+ * request it */
+ if (!(pcf->flags & PCF50633_F_RTC_SECOND))
+@@ -2135,6 +2156,7 @@ static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind)
+ INIT_WORK(&pcf->work_usb_curlimit, pcf50633_work_usbcurlim);
+ pcf->irq = irq;
+ pcf->working = 0;
++ pcf->suppress_onkey_events = 0;
+ pcf->onkey_seconds = -1;
+ pcf->pdata = pcf50633_pdev->dev.platform_data;
+
+--
+1.5.6.5
+