Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com> --- drivers/input/keyboard/tosakbd.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/drivers/input/keyboard/tosakbd.c b/drivers/input/keyboard/tosakbd.c index 3884d1e..306cbe8 100644 --- a/drivers/input/keyboard/tosakbd.c +++ b/drivers/input/keyboard/tosakbd.c @@ -210,6 +210,9 @@ static int tosakbd_suspend(struct platform_device *dev, pm_message_t state) del_timer_sync(&tosakbd->timer); + PGSR1 = (PGSR1 & ~TOSA_GPIO_LOW_STROBE_BIT); + PGSR2 = (PGSR2 & ~TOSA_GPIO_HIGH_STROBE_BIT); + return 0; } -- 1.5.4.4 -- With best wishes Dmitry --
Hi Dmitry, What if interrupt comes here? The whole suspend path seems racy with -- Dmitry --
Hi, Dmitry, What is the best way to fix it? Moving from suspend to suspend_late seems to be a hack. -- With best wishes Dmitry --
How about we take the lock in tosakbd_suspend, set flag indicating that the
picece is suspended, do the discharge and then del_timer_sync()? If you change
tosakbd_scankeyboard() to check for suspend flag and exit as soon as it sees it
it should take care of the most of the issues I think. Something like this:
Subject: Input: tosakbd - fix suspend
From: Dmitry Baryshkov <dbaryshkov@gmail.com>
Input: tosakbd - fix suspend
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
---
drivers/input/keyboard/tosakbd.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
Index: linux/drivers/input/keyboard/tosakbd.c
===================================================================
--- linux.orig/drivers/input/keyboard/tosakbd.c
+++ linux/drivers/input/keyboard/tosakbd.c
@@ -52,7 +52,7 @@ KEY_X, KEY_F, KEY_SPACE, KEY_APOSTROPHE,
struct tosakbd {
unsigned int keycode[ARRAY_SIZE(tosakbd_keycode)];
struct input_dev *input;
-
+ int suspeneded;
spinlock_t lock; /* protect kbd scanning */
struct timer_list timer;
};
@@ -133,6 +133,9 @@ static void tosakbd_scankeyboard(struct
spin_lock_irqsave(&tosakbd->lock, flags);
+ if (tosakbd->suspended)
+ goto out;
+
for (col = 0; col < TOSA_KEY_STROBE_NUM; col++) {
/*
* Discharge the output driver capacitatance
@@ -174,6 +177,7 @@ static void tosakbd_scankeyboard(struct
if (num_pressed)
mod_timer(&tosakbd->timer, jiffies + SCAN_INTERVAL);
+ out:
spin_unlock_irqrestore(&tosakbd->lock, flags);
}
@@ -200,6 +204,7 @@ static irqreturn_t tosakbd_interrupt(int
static void tosakbd_timer_callback(unsigned long __dev)
{
struct platform_device *dev = (struct platform_device *)__dev;
+
tosakbd_scankeyboard(dev);
}
@@ -207,6 +212,13 @@ static void tosakbd_timer_callback(unsig
static int tosakbd_suspend(struct platform_device *dev, pm_message_t state)
{
struct tosakbd *tosakbd = ...Hi,
Fixed two minor glitches. Works for me. Please add it to your tree.
Subject: Input: tosakbd - fix suspend
Input: tosakbd - fix suspend
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
---
drivers/input/keyboard/tosakbd.c | 21 ++++++++++++++++++---
1 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/drivers/input/keyboard/tosakbd.c b/drivers/input/keyboard/tosakbd.c
index 3884d1e..a247006 100644
--- a/drivers/input/keyboard/tosakbd.c
+++ b/drivers/input/keyboard/tosakbd.c
@@ -52,7 +52,7 @@ KEY_X, KEY_F, KEY_SPACE, KEY_APOSTROPHE, TOSA_KEY_MAIL, KEY_LEFT, KEY_DOWN, KEY_
struct tosakbd {
unsigned int keycode[ARRAY_SIZE(tosakbd_keycode)];
struct input_dev *input;
-
+ int suspended;
spinlock_t lock; /* protect kbd scanning */
struct timer_list timer;
};
@@ -133,6 +133,9 @@ static void tosakbd_scankeyboard(struct platform_device *dev)
spin_lock_irqsave(&tosakbd->lock, flags);
+ if (tosakbd->suspended)
+ goto out;
+
for (col = 0; col < TOSA_KEY_STROBE_NUM; col++) {
/*
* Discharge the output driver capacitatance
@@ -174,6 +177,7 @@ static void tosakbd_scankeyboard(struct platform_device *dev)
if (num_pressed)
mod_timer(&tosakbd->timer, jiffies + SCAN_INTERVAL);
+ out:
spin_unlock_irqrestore(&tosakbd->lock, flags);
}
@@ -200,6 +204,7 @@ static irqreturn_t tosakbd_interrupt(int irq, void *__dev)
static void tosakbd_timer_callback(unsigned long __dev)
{
struct platform_device *dev = (struct platform_device *)__dev;
+
tosakbd_scankeyboard(dev);
}
@@ -207,6 +212,13 @@ static void tosakbd_timer_callback(unsigned long __dev)
static int tosakbd_suspend(struct platform_device *dev, pm_message_t state)
{
struct tosakbd *tosakbd = platform_get_drvdata(dev);
+ unsigned long flags;
+
+ spin_lock_irqsave(&tosakbd->lock, flags);
+ PGSR1 = (PGSR1 & ~TOSA_GPIO_LOW_STROBE_BIT);
+ PGSR2 = (PGSR2 & ~TOSA_GPIO_HIGH_STROBE_BIT);
+ tosakbd->suspended = ...Hi, Sorry, that was me... Sometimes I hate git-am & git-format-patch -- With best wishes Dmitry --
What were they? I dont see any difference from the patch I sent to you, so I want to make sure I have the correct version. -- Dmitry --
Hi, suspended instead of suspeneded in struct tosakbd definition, declaration of tosakbd in tosakbd_resume. -- With best wishes Dmitry --
