[PATCH] input: gpio-keys: initialize the input value with the current gpioval
Marco Felsch <[email protected]> Thu, 25 Jun 2026 13:51:47 +0200
| Newsgroups | org.infradead.lists.barebox |
|---|---|
| Message-ID | <[email protected]> |
This is required for deep-probe systems which prove the "gpio-keys" device on demand. In such case the input value is not yet accessible once the probe finished. However, board code queries the input device value directly after the of.*ensure.*probed(). Therefore provide a sane default by reading the gpio value during probe and init the input device value. Signed-off-by: Marco Felsch <[email protected]> --- drivers/input/gpio_keys.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/input/gpio_keys.c b/drivers/input/gpio_keys.c index b52738f5ccb2..316ed73ddfd1 100644 --- a/drivers/input/gpio_keys.c +++ b/drivers/input/gpio_keys.c @@ -143,6 +143,26 @@ static int gpio_keys_probe_dt(struct gpio_keys *gk, struct device *dev) return 0; } +static int gpio_keys_set_initialval(struct gpio_keys *gk) +{ + struct gpio_key *gb; + int i, pressed; + + for (i = 0; i < gk->nbuttons; i++) { + + gb = &gk->buttons[i]; + pressed = gpiod_get_value(gb->gpio); + + if (pressed != gb->previous_state) { + gb->debounce_start = get_time_ns(); + input_report_key_event(&gk->input, gb->code, pressed); + dev_dbg(gk->input.parent, "%s gpio #%d as %d\n", + pressed ? "pressed" : "released", i, gb->code); + gb->previous_state = pressed; + } + } +} + static int __init gpio_keys_probe(struct device *dev) { int ret; @@ -163,6 +183,8 @@ static int __init gpio_keys_probe(struct device *dev) if (ret) return ret; + gpio_keys_set_initialval(gk); + ret = poller_async_register(&gk->poller, dev_name(dev)); if (ret) return ret; -- 2.47.3