aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorChao Xie <chao.xie@marvell.com>2012-03-31 22:08:01 -0400
committerHaojian Zhuang <haojian.zhuang@gmail.com>2012-04-27 04:48:09 -0400
commit6ce34a5fb4955fac1eebe080e1c2784bc8710449 (patch)
treed8f4d6a8111a931c924a8e822db0b56dfe0322be /drivers/input
parent66f75a5d028beaf67c931435fdc3e7823125730c (diff)
Input: pxa27x_keypad keep clock on as wakeup source
When the keypad is used as wake up source, the clock can not be disabled. Or it can not detect key pressing. If the keypad is used as wake up source, when resume back, do not enable the clock and configure it again because the register content is retained. Signed-off-by: Chao Xie <chao.xie@marvell.com> Signed-off-by: Haojian Zhuang <haojian.zhuang@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/keyboard/pxa27x_keypad.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c
index 29fe1b2be1c1..b07771e83063 100644
--- a/drivers/input/keyboard/pxa27x_keypad.c
+++ b/drivers/input/keyboard/pxa27x_keypad.c
@@ -399,7 +399,7 @@ static int pxa27x_keypad_open(struct input_dev *dev)
399 struct pxa27x_keypad *keypad = input_get_drvdata(dev); 399 struct pxa27x_keypad *keypad = input_get_drvdata(dev);
400 400
401 /* Enable unit clock */ 401 /* Enable unit clock */
402 clk_enable(keypad->clk); 402 clk_prepare_enable(keypad->clk);
403 pxa27x_keypad_config(keypad); 403 pxa27x_keypad_config(keypad);
404 404
405 return 0; 405 return 0;
@@ -410,7 +410,7 @@ static void pxa27x_keypad_close(struct input_dev *dev)
410 struct pxa27x_keypad *keypad = input_get_drvdata(dev); 410 struct pxa27x_keypad *keypad = input_get_drvdata(dev);
411 411
412 /* Disable clock unit */ 412 /* Disable clock unit */
413 clk_disable(keypad->clk); 413 clk_disable_unprepare(keypad->clk);
414} 414}
415 415
416#ifdef CONFIG_PM 416#ifdef CONFIG_PM
@@ -419,10 +419,14 @@ static int pxa27x_keypad_suspend(struct device *dev)
419 struct platform_device *pdev = to_platform_device(dev); 419 struct platform_device *pdev = to_platform_device(dev);
420 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); 420 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
421 421
422 clk_disable(keypad->clk); 422 /*
423 423 * If the keypad is used a wake up source, clock can not be disabled.
424 * Or it can not detect the key pressing.
425 */
424 if (device_may_wakeup(&pdev->dev)) 426 if (device_may_wakeup(&pdev->dev))
425 enable_irq_wake(keypad->irq); 427 enable_irq_wake(keypad->irq);
428 else
429 clk_disable_unprepare(keypad->clk);
426 430
427 return 0; 431 return 0;
428} 432}
@@ -433,19 +437,24 @@ static int pxa27x_keypad_resume(struct device *dev)
433 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); 437 struct pxa27x_keypad *keypad = platform_get_drvdata(pdev);
434 struct input_dev *input_dev = keypad->input_dev; 438 struct input_dev *input_dev = keypad->input_dev;
435 439
436 if (device_may_wakeup(&pdev->dev)) 440 /*
441 * If the keypad is used as wake up source, the clock is not turned
442 * off. So do not need configure it again.
443 */
444 if (device_may_wakeup(&pdev->dev)) {
437 disable_irq_wake(keypad->irq); 445 disable_irq_wake(keypad->irq);
446 } else {
447 mutex_lock(&input_dev->mutex);
438 448
439 mutex_lock(&input_dev->mutex); 449 if (input_dev->users) {
450 /* Enable unit clock */
451 clk_prepare_enable(keypad->clk);
452 pxa27x_keypad_config(keypad);
453 }
440 454
441 if (input_dev->users) { 455 mutex_unlock(&input_dev->mutex);
442 /* Enable unit clock */
443 clk_enable(keypad->clk);
444 pxa27x_keypad_config(keypad);
445 } 456 }
446 457
447 mutex_unlock(&input_dev->mutex);
448
449 return 0; 458 return 0;
450} 459}
451 460