Input: tosakbd - fix suspend
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
parent
45d09e1e09
commit
5550fbaeb3
1 changed files with 18 additions and 3 deletions
|
@ -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 = 1;
|
||||
spin_unlock_irqrestore(&tosakbd->lock, flags);
|
||||
|
||||
del_timer_sync(&tosakbd->timer);
|
||||
|
||||
|
@ -215,6 +227,9 @@ static int tosakbd_suspend(struct platform_device *dev, pm_message_t state)
|
|||
|
||||
static int tosakbd_resume(struct platform_device *dev)
|
||||
{
|
||||
struct tosakbd *tosakbd = platform_get_drvdata(dev);
|
||||
|
||||
tosakbd->suspended = 0;
|
||||
tosakbd_scankeyboard(dev);
|
||||
|
||||
return 0;
|
||||
|
@ -365,8 +380,8 @@ fail:
|
|||
return error;
|
||||
}
|
||||
|
||||
static int __devexit tosakbd_remove(struct platform_device *dev) {
|
||||
|
||||
static int __devexit tosakbd_remove(struct platform_device *dev)
|
||||
{
|
||||
int i;
|
||||
struct tosakbd *tosakbd = platform_get_drvdata(dev);
|
||||
|
||||
|
|
Reference in a new issue