From: Enrico Weigelt <info@xxxxxxxxx> Support the recently introduced gpio lookup tables for attaching to gpio lines. So, harcoded gpio numbers aren't needed anymore. changes v4: * completely rewritten in a much simpler way, now just adding a third case (in the button probe loop), where neither oftree nor raw gpio number exists. changes v3: * fix printf string in gpio_keys_polled_get_gpiod() * fix unused variable 'error' in gpio_keys_polled_get_gpiod() * fix uninitialized variable in gpio_keys_polled_get_gpiod_fwnode() Cc: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx> Cc: linux-input@xxxxxxxxxxxxxxx Signed-off-by: Enrico Weigelt <info@xxxxxxxxx> --- drivers/input/keyboard/gpio_keys_polled.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c index 6eb0a2f3f9de..9ef8c7dade27 100644 --- a/drivers/input/keyboard/gpio_keys_polled.c +++ b/drivers/input/keyboard/gpio_keys_polled.c @@ -307,7 +307,7 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) fwnode_handle_put(child); return error; } - } else if (gpio_is_valid(button->gpio)) { + } else if ((button->gpio > 0) && gpio_is_valid(button->gpio)) { /* * Legacy GPIO number so request the GPIO here and * convert it to descriptor. @@ -333,6 +333,18 @@ static int gpio_keys_polled_probe(struct platform_device *pdev) button->gpio); return -EINVAL; } + } else { + /* try via gpio lookup table */ + bdata->gpiod = devm_gpiod_get_index(dev, NULL, i, GPIOF_IN); + if (IS_ERR(bdata->gpiod)) { + dev_err(dev, + "unable to get gpio for button %d: %ld\n", + i, PTR_ERR(bdata->gpiod)); + return PTR_ERR(bdata->gpiod); + } + + gpiod_set_consumer_name(bdata->gpiod, + button->desc ? : DRV_NAME); } bdata->last_state = -1; -- 2.11.0