[PATCH v2 1/3] Input: gpio-keys - set EV_ABS axis parameters at setup time
From: Xiong Nandi
Date: Sun Mar 22 2026 - 07:36:44 EST
The driver calls input_set_capability() for EV_ABS axes but never
sets the actual axis parameters, so the input subsystem sees
unbounded ranges.
Add a helper that scans buttons sharing the same axis code, works
out the min/max values, and calls input_set_abs_params().
Signed-off-by: Xiong Nandi <xndchn@xxxxxxxxx>
---
drivers/input/keyboard/gpio_keys.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index e19617485679..f97ca8dd073a 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -493,6 +493,27 @@ static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id)
return IRQ_HANDLED;
}
+static void gpio_keys_set_abs_params(struct input_dev *input,
+ struct gpio_keys_drvdata *ddata,
+ unsigned int code)
+{
+ int i, min = 0, max = 0;
+
+ for (i = 0; i < ddata->pdata->nbuttons; i++) {
+ const struct gpio_keys_button *button = &ddata->pdata->buttons[i];
+
+ if (button->type != EV_ABS || button->code != code)
+ continue;
+
+ if (button->value < min)
+ min = button->value;
+ if (button->value > max)
+ max = button->value;
+ }
+
+ input_set_abs_params(input, code, min, max, 0, 0);
+}
+
static int gpio_keys_setup_key(struct platform_device *pdev,
struct input_dev *input,
struct gpio_keys_drvdata *ddata,
@@ -651,6 +672,8 @@ static int gpio_keys_setup_key(struct platform_device *pdev,
bdata->code = &ddata->keymap[idx];
*bdata->code = button->code;
input_set_capability(input, button->type ?: EV_KEY, *bdata->code);
+ if ((button->type ?: EV_KEY) == EV_ABS)
+ gpio_keys_set_abs_params(input, ddata, button->code);
/*
* Install custom action to cancel release timer and
--
2.25.1