public inbox for linux-input@vger.kernel.org
 help / color / mirror / Atom feed
* [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