* [PATCH 0/2] add driver for max16150
@ 2026-02-23 11:03 Marc Paolo Sosa via B4 Relay
2026-02-23 11:03 ` [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml Marc Paolo Sosa via B4 Relay
2026-02-23 11:03 ` [PATCH 2/2] input: misc: add driver for max16150 Marc Paolo Sosa via B4 Relay
0 siblings, 2 replies; 11+ messages in thread
From: Marc Paolo Sosa via B4 Relay @ 2026-02-23 11:03 UTC (permalink / raw)
To: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-input, devicetree, linux-kernel, Marc Paolo Sosa
Introduce pushbutton control and debouncing support for the
MAX16150/MAX16169. The component is a low‑power on/off controller
featuring an integrated switch debouncer and internal latch, designed
to accept a noisy mechanical pushbutton input while providing a clean,
stable latched output. It also includes a one‑shot interrupt output for
event signaling, enabling reliable switch interfacing in low‑power embedded
systems.
Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
---
Marc Paolo Sosa (2):
dt-bindings: input: add adi,max16150.yaml
input: misc: add driver for max16150
.../devicetree/bindings/input/adi,max16150.yaml | 57 ++++++++
drivers/input/misc/Kconfig | 9 ++
drivers/input/misc/Makefile | 1 +
drivers/input/misc/max16150.c | 161 +++++++++++++++++++++
4 files changed, 228 insertions(+)
---
base-commit: e7b53288d9ea899abc6d47a7f20065ab511a810c
change-id: 20260223-max16150-8ef94e643cd0
Best regards,
--
Marc Paolo Sosa <marcpaolo.sosa@analog.com>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 11:03 [PATCH 0/2] add driver for max16150 Marc Paolo Sosa via B4 Relay
@ 2026-02-23 11:03 ` Marc Paolo Sosa via B4 Relay
2026-02-23 12:24 ` Rob Herring (Arm)
` (2 more replies)
2026-02-23 11:03 ` [PATCH 2/2] input: misc: add driver for max16150 Marc Paolo Sosa via B4 Relay
1 sibling, 3 replies; 11+ messages in thread
From: Marc Paolo Sosa via B4 Relay @ 2026-02-23 11:03 UTC (permalink / raw)
To: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-input, devicetree, linux-kernel, Marc Paolo Sosa
From: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
Add documentation for device tree bindings for MAX16150/MAX16169
Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
---
.../devicetree/bindings/input/adi,max16150.yaml | 57 ++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/adi,max16150.yaml b/Documentation/devicetree/bindings/input/adi,max16150.yaml
new file mode 100644
index 000000000000..327811e1ebd4
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/adi,max16150.yaml
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/adi,max16150.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Analog Devices MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller
+
+maintainers:
+ - Marc Paolo Sosa <marcpaolo.sosa@analog.com>
+
+description:
+ The MAX16150/MAX16169 is a low-power pushbutton on/off controller with a
+ switch debouncer and built-in latch. It accepts a noisy input from a
+ mechanical switch and produces a clean latched output, as well as a one-shot
+ interrupt output.
+
+properties:
+ compatible:
+ description:
+ Specifies the supported device variants. The MAX16150 and MAX16169 are supported.
+ enum:
+ - adi,max16150a
+ - adi,max16150b
+ - adi,max16169a
+ - adi,max16169b
+
+ interrupt-gpio:
+ maxItems: 1
+
+ clr-gpios:
+ description:
+ Clear Input. Pulling CLR low deasserts the latched OUT signal. If OUT is
+ already deasserted when CLR is pulled low, the state of OUT is unchanged.
+ maxItems: 1
+
+ linux,code:
+ default: KEY_POWER
+
+required:
+ - compatible
+ - interrupt-gpios
+ - clr-gpios
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/input/linux-event-codes.h>
+ #include <dt-bindings/gpio/gpio.h>
+
+ power-button {
+ compatible = "adi,max16150a";
+ interrupt-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
+ clr-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_POWER>;
+ };
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/2] input: misc: add driver for max16150
2026-02-23 11:03 [PATCH 0/2] add driver for max16150 Marc Paolo Sosa via B4 Relay
2026-02-23 11:03 ` [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml Marc Paolo Sosa via B4 Relay
@ 2026-02-23 11:03 ` Marc Paolo Sosa via B4 Relay
2026-02-24 22:42 ` Dmitry Torokhov
1 sibling, 1 reply; 11+ messages in thread
From: Marc Paolo Sosa via B4 Relay @ 2026-02-23 11:03 UTC (permalink / raw)
To: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: linux-input, devicetree, linux-kernel, Marc Paolo Sosa
From: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller
Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
---
drivers/input/misc/Kconfig | 9 +++
drivers/input/misc/Makefile | 1 +
drivers/input/misc/max16150.c | 161 ++++++++++++++++++++++++++++++++++++++++++
3 files changed, 171 insertions(+)
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index 94a753fcb64f..a31d3d2a7fd6 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -178,6 +178,15 @@ config INPUT_E3X0_BUTTON
To compile this driver as a module, choose M here: the
module will be called e3x0_button.
+config INPUT_MAX16150_PWRBUTTON
+ tristate "MAX16150/MAX16169 Pushbutton driver"
+ help
+ Say Y here if you want to enable power key reporting via
+ MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller.
+
+ To compile this driver as a module, choose M here. The module will
+ be called max16150.
+
config INPUT_PCSPKR
tristate "PC Speaker support"
depends on PCSPKR_PLATFORM
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 415fc4e2918b..c2c1c45f2df6 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -52,6 +52,7 @@ obj-$(CONFIG_INPUT_IQS7222) += iqs7222.o
obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o
obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
+obj-$(CONFIG_INPUT_MAX16150_PWRBUTTON) += max16150.o
obj-$(CONFIG_INPUT_MAX7360_ROTARY) += max7360-rotary.o
obj-$(CONFIG_INPUT_MAX77650_ONKEY) += max77650-onkey.o
obj-$(CONFIG_INPUT_MAX77693_HAPTIC) += max77693-haptic.o
diff --git a/drivers/input/misc/max16150.c b/drivers/input/misc/max16150.c
new file mode 100644
index 000000000000..ae353b926afc
--- /dev/null
+++ b/drivers/input/misc/max16150.c
@@ -0,0 +1,161 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Analog Devices MAX16150/MAX16169 Pushbutton Driver
+ *
+ * Copyright 2025 Analog Devices Inc.
+ */
+
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/gpio/consumer.h>
+#include <linux/kernel.h>
+#include <linux/mod_devicetable.h>
+#include <linux/platform_device.h>
+#include <linux/property.h>
+
+#define MAX16150_LONG_INTERRUPT 120000000
+
+struct max16150_chip_info {
+ bool has_clr_gpio;
+};
+
+struct max16150_device {
+ struct input_dev *input;
+ struct gpio_desc *gpiod;
+ struct gpio_desc *clr_gpiod;
+ const struct max16150_chip_info *chip_info;
+ u64 low, high, duration;
+ unsigned int keycode;
+};
+
+static irqreturn_t max16150_irq_handler(int irq, void *_max16150)
+{
+ struct max16150_device *max16150 = _max16150;
+ int value;
+
+ value = gpiod_get_value(max16150->gpiod);
+
+ if (!value) {
+ max16150->low = ktime_get_ns();
+ return IRQ_HANDLED;
+ }
+
+ max16150->high = ktime_get_ns();
+ if (max16150->low) {
+ max16150->duration = max16150->high - max16150->low;
+
+ if (max16150->duration > MAX16150_LONG_INTERRUPT) {
+ gpiod_set_value(max16150->clr_gpiod, 1);
+ input_report_key(max16150->input, max16150->keycode, 1);
+ input_sync(max16150->input);
+ input_report_key(max16150->input, max16150->keycode, 0);
+ input_sync(max16150->input);
+ }
+
+ max16150->low = 0;
+ }
+
+ return IRQ_HANDLED;
+}
+
+static const struct max16150_chip_info max16150_variant_a = {
+ .has_clr_gpio = true,
+};
+
+static const struct max16150_chip_info max16150_variant_b = {
+ .has_clr_gpio = false,
+};
+
+static int max16150_probe(struct platform_device *pdev)
+{
+ const struct max16150_chip_info *chip_info;
+ struct max16150_device *max16150;
+ struct device *dev = &pdev->dev;
+ int err, irq, ret;
+ u32 keycode;
+
+ chip_info = device_get_match_data(dev);
+ if (!chip_info)
+ return -EINVAL;
+
+ max16150 = devm_kzalloc(dev, sizeof(*max16150), GFP_KERNEL);
+ if (!max16150)
+ return -ENOMEM;
+
+ max16150->chip_info = chip_info;
+
+ max16150->input = devm_input_allocate_device(dev);
+ if (!max16150->input)
+ return -ENOMEM;
+
+ max16150->input->name = "MAX16150 Pushbutton";
+ max16150->input->phys = "max16150/input0";
+ max16150->input->id.bustype = BUS_HOST;
+
+ keycode = KEY_POWER;
+ ret = device_property_read_u32(dev, "linux,code", &keycode);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to get keycode\n");
+
+ max16150->keycode = keycode;
+
+ input_set_capability(max16150->input, EV_KEY, max16150->keycode);
+
+ max16150->gpiod = devm_gpiod_get(dev, "interrupt", GPIOD_IN);
+ if (IS_ERR(max16150->gpiod))
+ return dev_err_probe(dev, PTR_ERR(max16150->gpiod),
+ "Failed to get interrupt GPIO\n");
+
+ if (chip_info->has_clr_gpio) {
+ max16150->clr_gpiod = devm_gpiod_get(dev, "clr", GPIOD_OUT_HIGH);
+ if (IS_ERR(max16150->clr_gpiod))
+ return dev_err_probe(dev, PTR_ERR(max16150->clr_gpiod),
+ "Failed to get clr GPIO\n");
+
+ if (!max16150->clr_gpiod)
+ return dev_err_probe(dev, -ENODEV,
+ "clr GPIO is mandatory\n");
+
+ if (max16150->clr_gpiod) {
+ fsleep(1000);
+ gpiod_set_value(max16150->clr_gpiod, 0);
+ }
+ }
+
+ irq = gpiod_to_irq(max16150->gpiod);
+ if (irq < 0)
+ return dev_err_probe(dev, irq,
+ "MAX16150: Failed to map GPIO to IRQ");
+
+ err = devm_request_irq(dev, irq, max16150_irq_handler,
+ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ "max16150_irq", max16150);
+ if (err)
+ return err;
+
+ return input_register_device(max16150->input);
+}
+
+static const struct of_device_id max16150_of_match[] = {
+ { .compatible = "adi,max16150a", .data = &max16150_variant_a },
+ { .compatible = "adi,max16150b", .data = &max16150_variant_b },
+ { .compatible = "adi,max16169a", .data = &max16150_variant_a },
+ { .compatible = "adi,max16169b", .data = &max16150_variant_b },
+ { }
+};
+MODULE_DEVICE_TABLE(of, max16150_of_match);
+
+static struct platform_driver max16150_driver = {
+ .probe = max16150_probe,
+ .driver = {
+ .name = "max16150",
+ .of_match_table = max16150_of_match,
+ },
+};
+module_platform_driver(max16150_driver);
+
+MODULE_AUTHOR("Marc Paolo Sosa <marcpaolo.sosa@analog.com>");
+MODULE_DESCRIPTION("MAX16150/MAX16169 Pushbutton Driver");
+MODULE_LICENSE("GPL");
--
2.34.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 11:03 ` [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml Marc Paolo Sosa via B4 Relay
@ 2026-02-23 12:24 ` Rob Herring (Arm)
2026-03-17 3:14 ` Sosa, Marc Paolo
2026-02-23 16:50 ` Rob Herring
2026-02-23 17:01 ` Krzysztof Kozlowski
2 siblings, 1 reply; 11+ messages in thread
From: Rob Herring (Arm) @ 2026-02-23 12:24 UTC (permalink / raw)
To: Marc Paolo Sosa
Cc: Dmitry Torokhov, linux-input, Conor Dooley, devicetree,
linux-kernel, Krzysztof Kozlowski
On Mon, 23 Feb 2026 19:03:39 +0800, Marc Paolo Sosa wrote:
> Add documentation for device tree bindings for MAX16150/MAX16169
>
> Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> ---
> .../devicetree/bindings/input/adi,max16150.yaml | 57 ++++++++++++++++++++++
> 1 file changed, 57 insertions(+)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/input/adi,max16150.example.dtb: power-button (adi,max16150a): 'interrupt-gpios' does not match any of the regexes: '^pinctrl-[0-9]+$'
from schema $id: http://devicetree.org/schemas/input/adi,max16150.yaml
doc reference errors (make refcheckdocs):
See https://patchwork.kernel.org/project/devicetree/patch/20260223-max16150-v1-1-38e2a4f0d0f1@analog.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 11:03 ` [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml Marc Paolo Sosa via B4 Relay
2026-02-23 12:24 ` Rob Herring (Arm)
@ 2026-02-23 16:50 ` Rob Herring
2026-03-17 3:13 ` Sosa, Marc Paolo
2026-02-23 17:01 ` Krzysztof Kozlowski
2 siblings, 1 reply; 11+ messages in thread
From: Rob Herring @ 2026-02-23 16:50 UTC (permalink / raw)
To: Marc Paolo Sosa
Cc: Dmitry Torokhov, Krzysztof Kozlowski, Conor Dooley, linux-input,
devicetree, linux-kernel
On Mon, Feb 23, 2026 at 07:03:39PM +0800, Marc Paolo Sosa wrote:
> Add documentation for device tree bindings for MAX16150/MAX16169
>
> Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> ---
> .../devicetree/bindings/input/adi,max16150.yaml | 57 ++++++++++++++++++++++
> 1 file changed, 57 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/adi,max16150.yaml b/Documentation/devicetree/bindings/input/adi,max16150.yaml
> new file mode 100644
> index 000000000000..327811e1ebd4
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/input/adi,max16150.yaml
> @@ -0,0 +1,57 @@
> +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/input/adi,max16150.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Analog Devices MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller
> +
> +maintainers:
> + - Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> +
> +description:
> + The MAX16150/MAX16169 is a low-power pushbutton on/off controller with a
> + switch debouncer and built-in latch. It accepts a noisy input from a
> + mechanical switch and produces a clean latched output, as well as a one-shot
> + interrupt output.
> +
> +properties:
> + compatible:
> + description:
> + Specifies the supported device variants. The MAX16150 and MAX16169 are supported.
Drop description.
> + enum:
> + - adi,max16150a
> + - adi,max16150b
> + - adi,max16169a
> + - adi,max16169b
What's the diff between a and b? If nothing s/w needs to know about,
then maybe you don't need to distinguish.
> +
> + interrupt-gpio:
> + maxItems: 1
Use 'interrupts' property.
> +
> + clr-gpios:
> + description:
> + Clear Input. Pulling CLR low deasserts the latched OUT signal. If OUT is
> + already deasserted when CLR is pulled low, the state of OUT is unchanged.
> + maxItems: 1
> +
> + linux,code:
> + default: KEY_POWER
> +
> +required:
> + - compatible
> + - interrupt-gpios
> + - clr-gpios
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/input/linux-event-codes.h>
> + #include <dt-bindings/gpio/gpio.h>
> +
> + power-button {
> + compatible = "adi,max16150a";
> + interrupt-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
> + clr-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
> + linux,code = <KEY_POWER>;
> + };
>
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 11:03 ` [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml Marc Paolo Sosa via B4 Relay
2026-02-23 12:24 ` Rob Herring (Arm)
2026-02-23 16:50 ` Rob Herring
@ 2026-02-23 17:01 ` Krzysztof Kozlowski
2026-03-17 1:51 ` Sosa, Marc Paolo
2 siblings, 1 reply; 11+ messages in thread
From: Krzysztof Kozlowski @ 2026-02-23 17:01 UTC (permalink / raw)
To: marcpaolo.sosa, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
Cc: linux-input, devicetree, linux-kernel
On 23/02/2026 12:03, Marc Paolo Sosa via B4 Relay wrote:
> +
> +properties:
> + compatible:
> + description:
> + Specifies the supported device variants. The MAX16150 and MAX16169 are supported.
> + enum:
> + - adi,max16150a
> + - adi,max16150b
> + - adi,max16169a
> + - adi,max16169b
Your driver code says 16150 and 16169 are compatible, to express it with
fallback (oneOf). See example-schema.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/2] input: misc: add driver for max16150
2026-02-23 11:03 ` [PATCH 2/2] input: misc: add driver for max16150 Marc Paolo Sosa via B4 Relay
@ 2026-02-24 22:42 ` Dmitry Torokhov
2026-03-17 3:12 ` Sosa, Marc Paolo
0 siblings, 1 reply; 11+ messages in thread
From: Dmitry Torokhov @ 2026-02-24 22:42 UTC (permalink / raw)
To: marcpaolo.sosa
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-input,
devicetree, linux-kernel
Hi Marc,
On Mon, Feb 23, 2026 at 07:03:40PM +0800, Marc Paolo Sosa via B4 Relay wrote:
> From: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
>
> MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller
>
> Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> ---
> drivers/input/misc/Kconfig | 9 +++
> drivers/input/misc/Makefile | 1 +
> drivers/input/misc/max16150.c | 161 ++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 171 insertions(+)
>
> diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> index 94a753fcb64f..a31d3d2a7fd6 100644
> --- a/drivers/input/misc/Kconfig
> +++ b/drivers/input/misc/Kconfig
> @@ -178,6 +178,15 @@ config INPUT_E3X0_BUTTON
> To compile this driver as a module, choose M here: the
> module will be called e3x0_button.
>
> +config INPUT_MAX16150_PWRBUTTON
> + tristate "MAX16150/MAX16169 Pushbutton driver"
> + help
> + Say Y here if you want to enable power key reporting via
> + MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller.
> +
> + To compile this driver as a module, choose M here. The module will
> + be called max16150.
> +
> config INPUT_PCSPKR
> tristate "PC Speaker support"
> depends on PCSPKR_PLATFORM
> diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
> index 415fc4e2918b..c2c1c45f2df6 100644
> --- a/drivers/input/misc/Makefile
> +++ b/drivers/input/misc/Makefile
> @@ -52,6 +52,7 @@ obj-$(CONFIG_INPUT_IQS7222) += iqs7222.o
> obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
> obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o
> obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
> +obj-$(CONFIG_INPUT_MAX16150_PWRBUTTON) += max16150.o
> obj-$(CONFIG_INPUT_MAX7360_ROTARY) += max7360-rotary.o
> obj-$(CONFIG_INPUT_MAX77650_ONKEY) += max77650-onkey.o
> obj-$(CONFIG_INPUT_MAX77693_HAPTIC) += max77693-haptic.o
> diff --git a/drivers/input/misc/max16150.c b/drivers/input/misc/max16150.c
> new file mode 100644
> index 000000000000..ae353b926afc
> --- /dev/null
> +++ b/drivers/input/misc/max16150.c
> @@ -0,0 +1,161 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Analog Devices MAX16150/MAX16169 Pushbutton Driver
> + *
> + * Copyright 2025 Analog Devices Inc.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/init.h>
> +#include <linux/input.h>
> +#include <linux/interrupt.h>
> +#include <linux/gpio/consumer.h>
> +#include <linux/kernel.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/platform_device.h>
> +#include <linux/property.h>
> +
> +#define MAX16150_LONG_INTERRUPT 120000000
> +
> +struct max16150_chip_info {
> + bool has_clr_gpio;
> +};
> +
> +struct max16150_device {
> + struct input_dev *input;
> + struct gpio_desc *gpiod;
> + struct gpio_desc *clr_gpiod;
> + const struct max16150_chip_info *chip_info;
> + u64 low, high, duration;
I do not think you need to store "high" and "duration", just "press"
time. I also do not think you need nanosecond resilution, jiffies will
do.
> + unsigned int keycode;
> +};
> +
> +static irqreturn_t max16150_irq_handler(int irq, void *_max16150)
> +{
> + struct max16150_device *max16150 = _max16150;
> + int value;
> +
> + value = gpiod_get_value(max16150->gpiod);
> +
> + if (!value) {
> + max16150->low = ktime_get_ns();
> + return IRQ_HANDLED;
> + }
> +
> + max16150->high = ktime_get_ns();
> + if (max16150->low) {
> + max16150->duration = max16150->high - max16150->low;
> +
> + if (max16150->duration > MAX16150_LONG_INTERRUPT) {
time_after() is probably what you need here.
> + gpiod_set_value(max16150->clr_gpiod, 1);
> + input_report_key(max16150->input, max16150->keycode, 1);
> + input_sync(max16150->input);
Why is press not reported right away?
> + input_report_key(max16150->input, max16150->keycode, 0);
> + input_sync(max16150->input);
> + }
> +
> + max16150->low = 0;
> + }
> +
> + return IRQ_HANDLED;
> +}
> +
> +static const struct max16150_chip_info max16150_variant_a = {
> + .has_clr_gpio = true,
> +};
> +
> +static const struct max16150_chip_info max16150_variant_b = {
> + .has_clr_gpio = false,
> +};
> +
> +static int max16150_probe(struct platform_device *pdev)
> +{
> + const struct max16150_chip_info *chip_info;
> + struct max16150_device *max16150;
> + struct device *dev = &pdev->dev;
> + int err, irq, ret;
Why do you need both err and ret?
> + u32 keycode;
> +
> + chip_info = device_get_match_data(dev);
> + if (!chip_info)
> + return -EINVAL;
> +
> + max16150 = devm_kzalloc(dev, sizeof(*max16150), GFP_KERNEL);
> + if (!max16150)
> + return -ENOMEM;
> +
> + max16150->chip_info = chip_info;
> +
> + max16150->input = devm_input_allocate_device(dev);
> + if (!max16150->input)
> + return -ENOMEM;
> +
> + max16150->input->name = "MAX16150 Pushbutton";
> + max16150->input->phys = "max16150/input0";
> + max16150->input->id.bustype = BUS_HOST;
> +
> + keycode = KEY_POWER;
> + ret = device_property_read_u32(dev, "linux,code", &keycode);
err = ...
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to get keycode\n");
> +
> + max16150->keycode = keycode;
> +
> + input_set_capability(max16150->input, EV_KEY, max16150->keycode);
> +
> + max16150->gpiod = devm_gpiod_get(dev, "interrupt", GPIOD_IN);
> + if (IS_ERR(max16150->gpiod))
> + return dev_err_probe(dev, PTR_ERR(max16150->gpiod),
> + "Failed to get interrupt GPIO\n");
> +
> + if (chip_info->has_clr_gpio) {
> + max16150->clr_gpiod = devm_gpiod_get(dev, "clr", GPIOD_OUT_HIGH);
> + if (IS_ERR(max16150->clr_gpiod))
> + return dev_err_probe(dev, PTR_ERR(max16150->clr_gpiod),
> + "Failed to get clr GPIO\n");
> +
> + if (!max16150->clr_gpiod)
How would we end up here? You are using devm_gpiod_get() which will
never return NULL GPIO descriptor.
> + return dev_err_probe(dev, -ENODEV,
> + "clr GPIO is mandatory\n");
> +
> + if (max16150->clr_gpiod) {
> + fsleep(1000);
> + gpiod_set_value(max16150->clr_gpiod, 0);
> + }
> + }
> +
> + irq = gpiod_to_irq(max16150->gpiod);
> + if (irq < 0)
> + return dev_err_probe(dev, irq,
> + "MAX16150: Failed to map GPIO to IRQ");
As Rob said in DT binding review use interrupts property and separate
IRQ and GPIO handling.
> +
> + err = devm_request_irq(dev, irq, max16150_irq_handler,
> + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
> + "max16150_irq", max16150);
> + if (err)
> + return err;
> +
> + return input_register_device(max16150->input);
err = input_register_device(...);
if (err)
return err;
return 0;
> +}
> +
> +static const struct of_device_id max16150_of_match[] = {
> + { .compatible = "adi,max16150a", .data = &max16150_variant_a },
> + { .compatible = "adi,max16150b", .data = &max16150_variant_b },
> + { .compatible = "adi,max16169a", .data = &max16150_variant_a },
> + { .compatible = "adi,max16169b", .data = &max16150_variant_b },
> + { }
> +};
> +MODULE_DEVICE_TABLE(of, max16150_of_match);
> +
> +static struct platform_driver max16150_driver = {
> + .probe = max16150_probe,
> + .driver = {
> + .name = "max16150",
> + .of_match_table = max16150_of_match,
> + },
> +};
> +module_platform_driver(max16150_driver);
> +
> +MODULE_AUTHOR("Marc Paolo Sosa <marcpaolo.sosa@analog.com>");
> +MODULE_DESCRIPTION("MAX16150/MAX16169 Pushbutton Driver");
> +MODULE_LICENSE("GPL");
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 17:01 ` Krzysztof Kozlowski
@ 2026-03-17 1:51 ` Sosa, Marc Paolo
0 siblings, 0 replies; 11+ messages in thread
From: Sosa, Marc Paolo @ 2026-03-17 1:51 UTC (permalink / raw)
To: Krzysztof Kozlowski, Dmitry Torokhov, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
> -----Original Message-----
> From: Krzysztof Kozlowski <krzk@kernel.org>
> Sent: Tuesday, February 24, 2026 1:02 AM
> To: Sosa, Marc Paolo <MarcPaolo.Sosa@analog.com>; Dmitry Torokhov
> <dmitry.torokhov@gmail.com>; Rob Herring <robh@kernel.org>; Krzysztof
> Kozlowski <krzk+dt@kernel.org>; Conor Dooley <conor+dt@kernel.org>
> Cc: linux-input@vger.kernel.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
>
> [External]
>
> On 23/02/2026 12:03, Marc Paolo Sosa via B4 Relay wrote:
> > +
> > +properties:
> > + compatible:
> > + description:
> > + Specifies the supported device variants. The MAX16150 and MAX16169
> are supported.
> > + enum:
> > + - adi,max16150a
> > + - adi,max16150b
> > + - adi,max16169a
> > + - adi,max16169b
>
> Your driver code says 16150 and 16169 are compatible, to express it with
> fallback (oneOf). See example-schema.
>
This is noted; I will apply this on my next patch.
Thanks,
Pao
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 2/2] input: misc: add driver for max16150
2026-02-24 22:42 ` Dmitry Torokhov
@ 2026-03-17 3:12 ` Sosa, Marc Paolo
0 siblings, 0 replies; 11+ messages in thread
From: Sosa, Marc Paolo @ 2026-03-17 3:12 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
linux-input@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
> -----Original Message-----
> From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> Sent: Wednesday, February 25, 2026 6:42 AM
> To: Sosa, Marc Paolo <MarcPaolo.Sosa@analog.com>
> Cc: Rob Herring <robh@kernel.org>; Krzysztof Kozlowski
> <krzk+dt@kernel.org>; Conor Dooley <conor+dt@kernel.org>; linux-
> input@vger.kernel.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH 2/2] input: misc: add driver for max16150
>
> [External]
>
> Hi Marc,
>
> On Mon, Feb 23, 2026 at 07:03:40PM +0800, Marc Paolo Sosa via B4 Relay
> wrote:
> > From: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> >
> > MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller
> >
> > Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> > ---
> > drivers/input/misc/Kconfig | 9 +++
> > drivers/input/misc/Makefile | 1 +
> > drivers/input/misc/max16150.c | 161
> > ++++++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 171 insertions(+)
> >
> > diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
> > index 94a753fcb64f..a31d3d2a7fd6 100644
> > --- a/drivers/input/misc/Kconfig
> > +++ b/drivers/input/misc/Kconfig
> > @@ -178,6 +178,15 @@ config INPUT_E3X0_BUTTON
> > To compile this driver as a module, choose M here: the
> > module will be called e3x0_button.
> >
> > +config INPUT_MAX16150_PWRBUTTON
> > + tristate "MAX16150/MAX16169 Pushbutton driver"
> > + help
> > + Say Y here if you want to enable power key reporting via
> > + MAX16150/MAX16169 nanoPower Pushbutton On/Off Controller.
> > +
> > + To compile this driver as a module, choose M here. The module will
> > + be called max16150.
> > +
> > config INPUT_PCSPKR
> > tristate "PC Speaker support"
> > depends on PCSPKR_PLATFORM
> > diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
> > index 415fc4e2918b..c2c1c45f2df6 100644
> > --- a/drivers/input/misc/Makefile
> > +++ b/drivers/input/misc/Makefile
> > @@ -52,6 +52,7 @@ obj-$(CONFIG_INPUT_IQS7222) += iqs7222.o
> > obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o
> > obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o
> > obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o
> > +obj-$(CONFIG_INPUT_MAX16150_PWRBUTTON) += max16150.o
> > obj-$(CONFIG_INPUT_MAX7360_ROTARY) += max7360-rotary.o
> > obj-$(CONFIG_INPUT_MAX77650_ONKEY) += max77650-onkey.o
> > obj-$(CONFIG_INPUT_MAX77693_HAPTIC) += max77693-haptic.o
> > diff --git a/drivers/input/misc/max16150.c
> > b/drivers/input/misc/max16150.c new file mode 100644 index
> > 000000000000..ae353b926afc
> > --- /dev/null
> > +++ b/drivers/input/misc/max16150.c
> > @@ -0,0 +1,161 @@
> > +// SPDX-License-Identifier: GPL-2.0-or-later
> > +/*
> > + * Analog Devices MAX16150/MAX16169 Pushbutton Driver
> > + *
> > + * Copyright 2025 Analog Devices Inc.
> > + */
> > +
> > +#include <linux/delay.h>
> > +#include <linux/init.h>
> > +#include <linux/input.h>
> > +#include <linux/interrupt.h>
> > +#include <linux/gpio/consumer.h>
> > +#include <linux/kernel.h>
> > +#include <linux/mod_devicetable.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/property.h>
> > +
> > +#define MAX16150_LONG_INTERRUPT 120000000
> > +
> > +struct max16150_chip_info {
> > + bool has_clr_gpio;
> > +};
> > +
> > +struct max16150_device {
> > + struct input_dev *input;
> > + struct gpio_desc *gpiod;
> > + struct gpio_desc *clr_gpiod;
> > + const struct max16150_chip_info *chip_info;
> > + u64 low, high, duration;
>
> I do not think you need to store "high" and "duration", just "press"
> time. I also do not think you need nanosecond resilution, jiffies will do.
>
> > + unsigned int keycode;
> > +};
> > +
> > +static irqreturn_t max16150_irq_handler(int irq, void *_max16150) {
> > + struct max16150_device *max16150 = _max16150;
> > + int value;
> > +
> > + value = gpiod_get_value(max16150->gpiod);
> > +
> > + if (!value) {
> > + max16150->low = ktime_get_ns();
> > + return IRQ_HANDLED;
> > + }
> > +
> > + max16150->high = ktime_get_ns();
> > + if (max16150->low) {
> > + max16150->duration = max16150->high - max16150->low;
> > +
> > + if (max16150->duration > MAX16150_LONG_INTERRUPT) {
>
> time_after() is probably what you need here.
>
> > + gpiod_set_value(max16150->clr_gpiod, 1);
> > + input_report_key(max16150->input, max16150-
> >keycode, 1);
> > + input_sync(max16150->input);
>
> Why is press not reported right away?
>
> > + input_report_key(max16150->input, max16150-
> >keycode, 0);
> > + input_sync(max16150->input);
> > + }
> > +
> > + max16150->low = 0;
> > + }
> > +
> > + return IRQ_HANDLED;
> > +}
> > +
> > +static const struct max16150_chip_info max16150_variant_a = {
> > + .has_clr_gpio = true,
> > +};
> > +
> > +static const struct max16150_chip_info max16150_variant_b = {
> > + .has_clr_gpio = false,
> > +};
> > +
> > +static int max16150_probe(struct platform_device *pdev) {
> > + const struct max16150_chip_info *chip_info;
> > + struct max16150_device *max16150;
> > + struct device *dev = &pdev->dev;
> > + int err, irq, ret;
>
> Why do you need both err and ret?
>
> > + u32 keycode;
> > +
> > + chip_info = device_get_match_data(dev);
> > + if (!chip_info)
> > + return -EINVAL;
> > +
> > + max16150 = devm_kzalloc(dev, sizeof(*max16150), GFP_KERNEL);
> > + if (!max16150)
> > + return -ENOMEM;
> > +
> > + max16150->chip_info = chip_info;
> > +
> > + max16150->input = devm_input_allocate_device(dev);
> > + if (!max16150->input)
> > + return -ENOMEM;
> > +
> > + max16150->input->name = "MAX16150 Pushbutton";
> > + max16150->input->phys = "max16150/input0";
> > + max16150->input->id.bustype = BUS_HOST;
> > +
> > + keycode = KEY_POWER;
> > + ret = device_property_read_u32(dev, "linux,code", &keycode);
>
> err = ...
>
> > + if (ret)
> > + return dev_err_probe(dev, ret, "Failed to get keycode\n");
> > +
> > + max16150->keycode = keycode;
> > +
> > + input_set_capability(max16150->input, EV_KEY, max16150->keycode);
> > +
> > + max16150->gpiod = devm_gpiod_get(dev, "interrupt", GPIOD_IN);
> > + if (IS_ERR(max16150->gpiod))
> > + return dev_err_probe(dev, PTR_ERR(max16150->gpiod),
> > + "Failed to get interrupt GPIO\n");
> > +
> > + if (chip_info->has_clr_gpio) {
> > + max16150->clr_gpiod = devm_gpiod_get(dev, "clr",
> GPIOD_OUT_HIGH);
> > + if (IS_ERR(max16150->clr_gpiod))
> > + return dev_err_probe(dev, PTR_ERR(max16150-
> >clr_gpiod),
> > + "Failed to get clr GPIO\n");
> > +
> > + if (!max16150->clr_gpiod)
>
>
> How would we end up here? You are using devm_gpiod_get() which will never
> return NULL GPIO descriptor.
>
> > + return dev_err_probe(dev, -ENODEV,
> > + "clr GPIO is mandatory\n");
> > +
> > + if (max16150->clr_gpiod) {
> > + fsleep(1000);
> > + gpiod_set_value(max16150->clr_gpiod, 0);
> > + }
> > + }
> > +
> > + irq = gpiod_to_irq(max16150->gpiod);
> > + if (irq < 0)
> > + return dev_err_probe(dev, irq,
> > + "MAX16150: Failed to map GPIO to IRQ");
>
> As Rob said in DT binding review use interrupts property and separate IRQ and
> GPIO handling.
>
> > +
> > + err = devm_request_irq(dev, irq, max16150_irq_handler,
> > + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
> > + "max16150_irq", max16150);
> > + if (err)
> > + return err;
> > +
> > + return input_register_device(max16150->input);
>
> err = input_register_device(...);
> if (err)
> return err;
>
> return 0;
>
> > +}
> > +
> > +static const struct of_device_id max16150_of_match[] = {
> > + { .compatible = "adi,max16150a", .data = &max16150_variant_a },
> > + { .compatible = "adi,max16150b", .data = &max16150_variant_b },
> > + { .compatible = "adi,max16169a", .data = &max16150_variant_a },
> > + { .compatible = "adi,max16169b", .data = &max16150_variant_b },
> > + { }
> > +};
> > +MODULE_DEVICE_TABLE(of, max16150_of_match);
> > +
> > +static struct platform_driver max16150_driver = {
> > + .probe = max16150_probe,
> > + .driver = {
> > + .name = "max16150",
> > + .of_match_table = max16150_of_match,
> > + },
> > +};
> > +module_platform_driver(max16150_driver);
> > +
> > +MODULE_AUTHOR("Marc Paolo Sosa <marcpaolo.sosa@analog.com>");
> > +MODULE_DESCRIPTION("MAX16150/MAX16169 Pushbutton Driver");
> > +MODULE_LICENSE("GPL");
>
Thank you for the initial review, I'll test the ff suggestions above and apply it to V2, for summary,
1. Switch from nanoseconds to jiffies with single press_time variable and
time_after() for comparison
2. Remove redundant err/ret variables and use consistent naming
3. Remove impossible NULL checks after devm_gpiod_get() since it never returns NULL
4. Fix device_property_read_u32() error handling since linux,code is optional with
default
5. Use explicit error checking pattern instead of implicit return
6. The MAX16150's OUT pin serves dual purposes (interrupt + GPIO state reading) -
should I use separate 'interrupts' and 'out-gpios' properties for the same physical pin, or is there a
preferred approach for this hardware design?
7. The duration measurement is needed since the device ignores short presses, but I could
report press immediately and validate on release instead
I'll send v2 with these improvements once I clarify the preferred IRQ/GPIO handling approach.
Best regards,
Pao
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 16:50 ` Rob Herring
@ 2026-03-17 3:13 ` Sosa, Marc Paolo
0 siblings, 0 replies; 11+ messages in thread
From: Sosa, Marc Paolo @ 2026-03-17 3:13 UTC (permalink / raw)
To: Rob Herring
Cc: Dmitry Torokhov, Krzysztof Kozlowski, Conor Dooley,
linux-input@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
> -----Original Message-----
> From: Rob Herring <robh@kernel.org>
> Sent: Tuesday, February 24, 2026 12:51 AM
> To: Sosa, Marc Paolo <MarcPaolo.Sosa@analog.com>
> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>; Krzysztof Kozlowski
> <krzk+dt@kernel.org>; Conor Dooley <conor+dt@kernel.org>; linux-
> input@vger.kernel.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org
> Subject: Re: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
>
> [External]
>
> On Mon, Feb 23, 2026 at 07:03:39PM +0800, Marc Paolo Sosa wrote:
> > Add documentation for device tree bindings for MAX16150/MAX16169
> >
> > Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> > ---
> > .../devicetree/bindings/input/adi,max16150.yaml | 57
> ++++++++++++++++++++++
> > 1 file changed, 57 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/input/adi,max16150.yaml
> > b/Documentation/devicetree/bindings/input/adi,max16150.yaml
> > new file mode 100644
> > index 000000000000..327811e1ebd4
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/input/adi,max16150.yaml
> > @@ -0,0 +1,57 @@
> > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) %YAML 1.2
> > +---
> > +$id:
> > +https://urldefense.com/v3/__http://devicetree.org/schemas/input/adi,m
> >
> +ax16150.yaml*__;Iw!!A3Ni8CS0y2Y!7MP9aN8nPEM3L2rIf_pWYnGRpvrMnRa
> dsVK3J
> > +dATD43g-6ZDMtcTwePpZWP1Ji7DaZoV6c0Iy5nMrfJM$
> > +$schema:
> > +https://urldefense.com/v3/__http://devicetree.org/meta-schemas/core.y
> >
> +aml*__;Iw!!A3Ni8CS0y2Y!7MP9aN8nPEM3L2rIf_pWYnGRpvrMnRadsVK3JdA
> TD43g-6
> > +ZDMtcTwePpZWP1Ji7DaZoV6c0IywbOF-bm$
> > +
> > +title: Analog Devices MAX16150/MAX16169 nanoPower Pushbutton On/Off
> > +Controller
> > +
> > +maintainers:
> > + - Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> > +
> > +description:
> > + The MAX16150/MAX16169 is a low-power pushbutton on/off controller
> > +with a
> > + switch debouncer and built-in latch. It accepts a noisy input from
> > +a
> > + mechanical switch and produces a clean latched output, as well as a
> > +one-shot
> > + interrupt output.
> > +
> > +properties:
> > + compatible:
> > + description:
> > + Specifies the supported device variants. The MAX16150 and MAX16169
> are supported.
>
> Drop description.
>
> > + enum:
> > + - adi,max16150a
> > + - adi,max16150b
> > + - adi,max16169a
> > + - adi,max16169b
>
> What's the diff between a and b? If nothing s/w needs to know about, then
> maybe you don't need to distinguish.
>
> > +
> > + interrupt-gpio:
> > + maxItems: 1
>
> Use 'interrupts' property.
>
> > +
> > + clr-gpios:
> > + description:
> > + Clear Input. Pulling CLR low deasserts the latched OUT signal. If OUT is
> > + already deasserted when CLR is pulled low, the state of OUT is
> unchanged.
> > + maxItems: 1
> > +
> > + linux,code:
> > + default: KEY_POWER
> > +
> > +required:
> > + - compatible
> > + - interrupt-gpios
> > + - clr-gpios
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + #include <dt-bindings/input/linux-event-codes.h>
> > + #include <dt-bindings/gpio/gpio.h>
> > +
> > + power-button {
> > + compatible = "adi,max16150a";
> > + interrupt-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
> > + clr-gpios = <&gpio 4 GPIO_ACTIVE_LOW>;
> > + linux,code = <KEY_POWER>;
> > + };
> >
> > --
> > 2.34.1
> >
This is noted, I'll test this out and will apply it on my next patch.
Regards,
Pao
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
2026-02-23 12:24 ` Rob Herring (Arm)
@ 2026-03-17 3:14 ` Sosa, Marc Paolo
0 siblings, 0 replies; 11+ messages in thread
From: Sosa, Marc Paolo @ 2026-03-17 3:14 UTC (permalink / raw)
To: Rob Herring (Arm)
Cc: Dmitry Torokhov, linux-input@vger.kernel.org, Conor Dooley,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Krzysztof Kozlowski
> -----Original Message-----
> From: Rob Herring (Arm) <robh@kernel.org>
> Sent: Monday, February 23, 2026 8:25 PM
> To: Sosa, Marc Paolo <MarcPaolo.Sosa@analog.com>
> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>; linux-
> input@vger.kernel.org; Conor Dooley <conor+dt@kernel.org>;
> devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; Krzysztof Kozlowski
> <krzk+dt@kernel.org>
> Subject: Re: [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml
>
> [External]
>
>
> On Mon, 23 Feb 2026 19:03:39 +0800, Marc Paolo Sosa wrote:
> > Add documentation for device tree bindings for MAX16150/MAX16169
> >
> > Signed-off-by: Marc Paolo Sosa <marcpaolo.sosa@analog.com>
> > ---
> > .../devicetree/bindings/input/adi,max16150.yaml | 57
> ++++++++++++++++++++++
> > 1 file changed, 57 insertions(+)
> >
>
> My bot found errors running 'make dt_binding_check' on your patch:
>
> yamllint warnings/errors:
>
> dtschema/dtc warnings/errors:
> /builds/robherring/dt-review-
> ci/linux/Documentation/devicetree/bindings/input/adi,max16150.example.dtb
> : power-button (adi,max16150a): 'interrupt-gpios' does not match any of the
> regexes: '^pinctrl-[0-9]+$'
> from schema $id:
> https://urldefense.com/v3/__http://devicetree.org/schemas/input/adi,max16
> 150.yaml__;!!A3Ni8CS0y2Y!-TPsir0eSI17GHXi7gGeaK1XizFHf0bf6SbAJdX07Ztz-
> nAbFzqUqkvcxua95NPqfd9F9hYLmClYnD4Q$
>
> doc reference errors (make refcheckdocs):
>
> See
> https://urldefense.com/v3/__https://patchwork.kernel.org/project/devicetree
> /patch/20260223-max16150-v1-1-
> 38e2a4f0d0f1@analog.com__;!!A3Ni8CS0y2Y!-
> TPsir0eSI17GHXi7gGeaK1XizFHf0bf6SbAJdX07Ztz-
> nAbFzqUqkvcxua95NPqfd9F9hYLmMWFLC-A$
>
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch.
>
> If you already ran 'make dt_binding_check' and didn't see the above error(s),
> then make sure 'yamllint' is installed and dt-schema is up to
> date:
>
> pip3 install dtschema --upgrade
>
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.
Alright, will check this out before sending another patch.
Thanks,
Pao
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-03-17 3:14 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-23 11:03 [PATCH 0/2] add driver for max16150 Marc Paolo Sosa via B4 Relay
2026-02-23 11:03 ` [PATCH 1/2] dt-bindings: input: add adi,max16150.yaml Marc Paolo Sosa via B4 Relay
2026-02-23 12:24 ` Rob Herring (Arm)
2026-03-17 3:14 ` Sosa, Marc Paolo
2026-02-23 16:50 ` Rob Herring
2026-03-17 3:13 ` Sosa, Marc Paolo
2026-02-23 17:01 ` Krzysztof Kozlowski
2026-03-17 1:51 ` Sosa, Marc Paolo
2026-02-23 11:03 ` [PATCH 2/2] input: misc: add driver for max16150 Marc Paolo Sosa via B4 Relay
2026-02-24 22:42 ` Dmitry Torokhov
2026-03-17 3:12 ` Sosa, Marc Paolo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox