* [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
* 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 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
* 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 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 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 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
* [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 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 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
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