Skip to content

Commit

Permalink
Input: gpio_keys - report initial state when opening the device
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dmitry Torokhov committed Nov 28, 2012
1 parent a57da34 commit 5b76d7b
Showing 1 changed file with 26 additions and 13 deletions.
39 changes: 26 additions & 13 deletions drivers/input/keyboard/gpio_keys.c
Original file line number Diff line number Diff line change
Expand Up @@ -526,12 +526,35 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
return error;
}

static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata)
{
struct input_dev *input = ddata->input;
int i;

for (i = 0; i < ddata->pdata->nbuttons; i++) {
struct gpio_button_data *bdata = &ddata->data[i];
if (gpio_is_valid(bdata->button->gpio))
gpio_keys_gpio_report_event(bdata);
}
input_sync(input);
}

static int gpio_keys_open(struct input_dev *input)
{
struct gpio_keys_drvdata *ddata = input_get_drvdata(input);
const struct gpio_keys_platform_data *pdata = ddata->pdata;
int error;

if (pdata->enable) {
error = pdata->enable(input->dev.parent);
if (error)
return error;
}

return pdata->enable ? pdata->enable(input->dev.parent) : 0;
/* Report current state of buttons that are connected to GPIOs */
gpio_keys_report_state(ddata);

return 0;
}

static void gpio_keys_close(struct input_dev *input)
Expand Down Expand Up @@ -731,14 +754,6 @@ static int gpio_keys_probe(struct platform_device *pdev)
goto fail3;
}

/* get current state of buttons that are connected to GPIOs */
for (i = 0; i < pdata->nbuttons; i++) {
struct gpio_button_data *bdata = &ddata->data[i];
if (gpio_is_valid(bdata->button->gpio))
gpio_keys_gpio_report_event(bdata);
}
input_sync(input);

device_init_wakeup(&pdev->dev, wakeup);

return 0;
Expand Down Expand Up @@ -810,11 +825,9 @@ static int gpio_keys_resume(struct device *dev)
struct gpio_button_data *bdata = &ddata->data[i];
if (bdata->button->wakeup && device_may_wakeup(dev))
disable_irq_wake(bdata->irq);

if (gpio_is_valid(bdata->button->gpio))
gpio_keys_gpio_report_event(bdata);
}
input_sync(ddata->input);

gpio_keys_report_state(ddata);

return 0;
}
Expand Down

0 comments on commit 5b76d7b

Please sign in to comment.