aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2012-11-24 04:22:43 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2012-11-28 01:40:01 -0500
commit5b76d7b4cd965a84d922f303fe51a49cca89f9bb (patch)
tree636618a36d9e172f24958a53e6aaa87b75a1e639
parenta57da34795452bbe44b55e2b69c3ab6b117cc4b4 (diff)
Input: gpio_keys - report initial state when opening the device
Instead of reporting the initial stage when the device is registered we should do it when the device is opened (so there are users). Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/keyboard/gpio_keys.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 1a5cb6f34f4c..c7764ca17b88 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -526,12 +526,35 @@ fail:
526 return error; 526 return error;
527} 527}
528 528
529static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata)
530{
531 struct input_dev *input = ddata->input;
532 int i;
533
534 for (i = 0; i < ddata->pdata->nbuttons; i++) {
535 struct gpio_button_data *bdata = &ddata->data[i];
536 if (gpio_is_valid(bdata->button->gpio))
537 gpio_keys_gpio_report_event(bdata);
538 }
539 input_sync(input);
540}
541
529static int gpio_keys_open(struct input_dev *input) 542static int gpio_keys_open(struct input_dev *input)
530{ 543{
531 struct gpio_keys_drvdata *ddata = input_get_drvdata(input); 544 struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
532 const struct gpio_keys_platform_data *pdata = ddata->pdata; 545 const struct gpio_keys_platform_data *pdata = ddata->pdata;
546 int error;
547
548 if (pdata->enable) {
549 error = pdata->enable(input->dev.parent);
550 if (error)
551 return error;
552 }
533 553
534 return pdata->enable ? pdata->enable(input->dev.parent) : 0; 554 /* Report current state of buttons that are connected to GPIOs */
555 gpio_keys_report_state(ddata);
556
557 return 0;
535} 558}
536 559
537static void gpio_keys_close(struct input_dev *input) 560static void gpio_keys_close(struct input_dev *input)
@@ -731,14 +754,6 @@ static int gpio_keys_probe(struct platform_device *pdev)
731 goto fail3; 754 goto fail3;
732 } 755 }
733 756
734 /* get current state of buttons that are connected to GPIOs */
735 for (i = 0; i < pdata->nbuttons; i++) {
736 struct gpio_button_data *bdata = &ddata->data[i];
737 if (gpio_is_valid(bdata->button->gpio))
738 gpio_keys_gpio_report_event(bdata);
739 }
740 input_sync(input);
741
742 device_init_wakeup(&pdev->dev, wakeup); 757 device_init_wakeup(&pdev->dev, wakeup);
743 758
744 return 0; 759 return 0;
@@ -810,11 +825,9 @@ static int gpio_keys_resume(struct device *dev)
810 struct gpio_button_data *bdata = &ddata->data[i]; 825 struct gpio_button_data *bdata = &ddata->data[i];
811 if (bdata->button->wakeup && device_may_wakeup(dev)) 826 if (bdata->button->wakeup && device_may_wakeup(dev))
812 disable_irq_wake(bdata->irq); 827 disable_irq_wake(bdata->irq);
813
814 if (gpio_is_valid(bdata->button->gpio))
815 gpio_keys_gpio_report_event(bdata);
816 } 828 }
817 input_sync(ddata->input); 829
830 gpio_keys_report_state(ddata);
818 831
819 return 0; 832 return 0;
820} 833}