[PATCH v2 4/6 RESEND] ARM: pxa27x_keypad: added wakeup event handler for keypad interrupts
From: Eric Miao <hidden>
Date: 2010-09-05 10:47:19
Also in:
linux-input, lkml
On Sun, Sep 5, 2010 at 4:02 PM, Igor Grinberg [off-list ref] wrote:
?On 09/04/10 01:28, Mark F. Brown wrote:quoted
mach-mmp needs to clear wake event in order to clear the keypad interrupt Signed-off-by: Mark F. Brown <redacted> --- ?arch/arm/plat-pxa/include/plat/pxa27x_keypad.h | ? ?1 + ?drivers/input/keyboard/pxa27x_keypad.c ? ? ? ? | ? 10 ++++++++++ ?2 files changed, 11 insertions(+), 0 deletions(-)diff --git a/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h index 7b4eadc..73dacda 100644 --- a/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h +++ b/arch/arm/plat-pxa/include/plat/pxa27x_keypad.h@@ -52,6 +52,7 @@ struct pxa27x_keypad_platform_data {? ? ? /* key debounce interval */ ? ? ? unsigned int ? ?debounce_interval; + ? ? void ? ? ? ? ? ?(*clear_wakeup_event)(void);I understand, this is a bit late... but still I want to ask a question: As I understand, the clear_wakeup_event() function is called in interrupt context, wouldn't it be wiser to add a comment on this, so platform (current/future) code will be aware and will make no heavy stuff in it (accidentally).
A comment will be good to have indeed, not just explaining the context this function will be running, but also a bit about why this is introduced. Mark, If you come up with an updated patch, I'll help rebase my tree.
quoted
?}; ?extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index 0610d10..b36d2be 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c@@ -330,11 +330,21 @@ static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad)? ? ? keypad->direct_key_state = new_state; ?} +static void clear_wakeup_event(struct pxa27x_keypad *keypad) +{ + ? ? struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + + ? ? if (pdata->clear_wakeup_event) + ? ? ? ? ? ? (pdata->clear_wakeup_event)(); +} + ?static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id) ?{ ? ? ? struct pxa27x_keypad *keypad = dev_id; ? ? ? unsigned long kpc = keypad_readl(KPC); + ? ? clear_wakeup_event(keypad); + ? ? ? if (kpc & KPC_DI) ? ? ? ? ? ? ? pxa27x_keypad_scan_direct(keypad);-- Regards, Igor.