* [PATCH v3 0/4] io: accel: mma8452: Allow open drain interrupt pin configuration
@ 2026-08-05 7:21 Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 1/4] dt-bindings: iio: accel: mma8452: Add drive-open-drain Esben Haabendal
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Esben Haabendal @ 2026-08-05 7:21 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger
Cc: Esben Haabendal, linux-iio, devicetree, linux-kernel,
Joshua Crofts
Extend the mma8452 driver with support for configuration of the
interrupt line in open-drain mode, which is needed for hardware designs
where the interrupt line is shared with other chips.
Adding drive-open-drain property to mma8452 device-tree node for such
designs to enable switching pin configuration to open-drain mode.
Signed-off-by: Esben Haabendal <esben@geanix.com>
---
Changes in v3:
- Reordered patches, swapping #2 and #3.
- Always add IRQF_SHARED flag.
- New patch to change it so IQRF_TRIGGER_LOW flag is only added when no
trigger type is set by firmware.
- Link to v2: https://patch.msgid.link/20260715-mma8452-open-drain-v2-0-95be9f5f4795@geanix.com
Changes in v2:
- Commit message of patch 2 updated.
- Operator precedence bug fixed in flags argument to
request_threaded_irq().
- Always check return value of mma8452_set_interrupt_pin_mode(), and just
check for non-zero value.
- Added new patch with optimization of struct mma8452_data ordering.
- Link to v1: https://patch.msgid.link/20260715-mma8452-open-drain-v1-0-b1dd2a440c60@geanix.com
To: Jonathan Cameron <jic23@kernel.org>
To: Lars-Peter Clausen <lars@metafoo.de>
To: Rob Herring <robh@kernel.org>
To: Krzysztof Kozlowski <krzk+dt@kernel.org>
To: Conor Dooley <conor+dt@kernel.org>
To: Martin Kepplinger <martink@posteo.de>
To: Sean Nyekjaer <sean@geanix.com>
To: David Lechner <dlechner@baylibre.com>
To: Nuno Sá <nuno.sa@analog.com>
To: Andy Shevchenko <andy@kernel.org>
To: Martin Kepplinger <martin.kepplinger@theobroma-systems.com>
Cc: linux-iio@vger.kernel.org
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
Esben Haabendal (4):
dt-bindings: iio: accel: mma8452: Add drive-open-drain
iio: accel: mma8452: Optimize struct mm8452_data member orders
iio: accel: mma8452: Only apply trigger type when not set by firmware
iio: accel: mma8452: Allow open drain interrupt pin configuration
.../devicetree/bindings/iio/accel/fsl,mma8452.yaml | 6 +++
drivers/iio/accel/mma8452.c | 44 +++++++++++++++++++---
2 files changed, 45 insertions(+), 5 deletions(-)
---
base-commit: 075b74841bd0065a3bda3440873c747938e69b68
change-id: 20250401-mma8452-open-drain-81577c41375c
Best regards,
--
Esben Haabendal <esben@geanix.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/4] dt-bindings: iio: accel: mma8452: Add drive-open-drain
2026-08-05 7:21 [PATCH v3 0/4] io: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
@ 2026-08-05 7:21 ` Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 2/4] iio: accel: mma8452: Optimize struct mm8452_data member orders Esben Haabendal
` (2 subsequent siblings)
3 siblings, 0 replies; 9+ messages in thread
From: Esben Haabendal @ 2026-08-05 7:21 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger
Cc: Esben Haabendal, linux-iio, devicetree, linux-kernel
Add new boolean to configure selected interrupt pin to open drain instead
of the default push-pull mode.
Acked-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Esben Haabendal <esben@geanix.com>
---
Documentation/devicetree/bindings/iio/accel/fsl,mma8452.yaml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/Documentation/devicetree/bindings/iio/accel/fsl,mma8452.yaml b/Documentation/devicetree/bindings/iio/accel/fsl,mma8452.yaml
index b0dd2b4e116a..20701aa725d0 100644
--- a/Documentation/devicetree/bindings/iio/accel/fsl,mma8452.yaml
+++ b/Documentation/devicetree/bindings/iio/accel/fsl,mma8452.yaml
@@ -39,6 +39,12 @@ properties:
minItems: 1
maxItems: 2
+ drive-open-drain:
+ $ref: /schemas/types.yaml#/definitions/flag
+ description: the interrupt line will be configured as open drain, which is
+ useful if several sensors share the same interrupt line. (This binding is
+ taken from pinctrl.)
+
vdd-supply: true
vddio-supply: true
--
2.55.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/4] iio: accel: mma8452: Optimize struct mm8452_data member orders
2026-08-05 7:21 [PATCH v3 0/4] io: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 1/4] dt-bindings: iio: accel: mma8452: Add drive-open-drain Esben Haabendal
@ 2026-08-05 7:21 ` Esben Haabendal
2026-08-10 19:47 ` Andy Shevchenko
2026-08-05 7:21 ` [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 4/4] iio: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
3 siblings, 1 reply; 9+ messages in thread
From: Esben Haabendal @ 2026-08-05 7:21 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger
Cc: Esben Haabendal, linux-iio, devicetree, linux-kernel,
Joshua Crofts
Reorder struct mma8452_data members to avoid holes.
Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
Signed-off-by: Esben Haabendal <esben@geanix.com>
---
drivers/iio/accel/mma8452.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
index 7d683686dd9d..f645a5c6fd1c 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -106,10 +106,7 @@ struct mma8452_data {
struct i2c_client *client;
struct mutex lock;
struct iio_mount_matrix orientation;
- u8 ctrl_reg1;
- u8 data_cfg;
const struct mma_chip_info *chip_info;
- int sleep_val;
struct regulator *vdd_reg;
struct regulator *vddio_reg;
@@ -118,6 +115,10 @@ struct mma8452_data {
__be16 channels[3];
aligned_s64 ts;
} buffer;
+
+ int sleep_val;
+ u8 ctrl_reg1;
+ u8 data_cfg;
};
/**
--
2.55.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware
2026-08-05 7:21 [PATCH v3 0/4] io: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 1/4] dt-bindings: iio: accel: mma8452: Add drive-open-drain Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 2/4] iio: accel: mma8452: Optimize struct mm8452_data member orders Esben Haabendal
@ 2026-08-05 7:21 ` Esben Haabendal
2026-08-10 19:50 ` Andy Shevchenko
2026-08-05 7:21 ` [PATCH v3 4/4] iio: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
3 siblings, 1 reply; 9+ messages in thread
From: Esben Haabendal @ 2026-08-05 7:21 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger
Cc: Esben Haabendal, linux-iio, devicetree, linux-kernel
Instead of unconditionally overriding the trigger type, it is better to
only apply a default when no trigger type is set by firmware. This should
be reasonably backward compatible, and should only potentially cause
problems if systems exist where firmware specifies an incorrect trigger
type. With a bit of luck, there are no such systems.
Signed-off-by: Esben Haabendal <esben@geanix.com>
---
drivers/iio/accel/mma8452.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
index f645a5c6fd1c..723ca3d9cb96 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -1683,9 +1683,14 @@ static int mma8452_probe(struct i2c_client *client)
goto trigger_cleanup;
if (client->irq) {
+ unsigned long irq_flags;
+
+ irq_flags = irq_get_trigger_type(client->irq);
+ if (irq_flags == IRQ_TYPE_NONE)
+ irq_flags = IRQF_TRIGGER_LOW;
+ irq_flags |= IRQF_ONESHOT;
ret = request_threaded_irq(client->irq, NULL, mma8452_interrupt,
- IRQF_TRIGGER_LOW | IRQF_ONESHOT,
- client->name, indio_dev);
+ irq_flags, client->name, indio_dev);
if (ret)
goto buffer_cleanup;
}
--
2.55.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 4/4] iio: accel: mma8452: Allow open drain interrupt pin configuration
2026-08-05 7:21 [PATCH v3 0/4] io: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
` (2 preceding siblings ...)
2026-08-05 7:21 ` [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware Esben Haabendal
@ 2026-08-05 7:21 ` Esben Haabendal
2026-08-10 19:51 ` Andy Shevchenko
3 siblings, 1 reply; 9+ messages in thread
From: Esben Haabendal @ 2026-08-05 7:21 UTC (permalink / raw)
To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger
Cc: Esben Haabendal, linux-iio, devicetree, linux-kernel
When sharing interrupt line with other chips, the interrupt pin most
likely needs to be configured in open-drain mode instead of push-pull.
The PP_OD bit in CTRL_REG3 is set when open-drain mode is configured,
allowing sharing the interrupt line with other devices (with same interrupt
polarity).
The IRQF_SHARED flag is added to request_threaded_irq() flags, indicating
that the interrupt line can be shared with other devices.
Signed-off-by: Esben Haabendal <esben@geanix.com>
---
drivers/iio/accel/mma8452.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
index 723ca3d9cb96..fa0915530f95 100644
--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -81,6 +81,8 @@
#define MMA8452_CTRL_REG2_RST BIT(6)
#define MMA8452_CTRL_REG2_MODS_SHIFT 3
#define MMA8452_CTRL_REG2_MODS_MASK 0x1b
+#define MMA8452_CTRL_REG3 0x2c
+#define MMA8452_CTRL_REG3_PP_OD BIT(0)
#define MMA8452_CTRL_REG4 0x2d
#define MMA8452_CTRL_REG5 0x2e
#define MMA8452_OFF_X 0x2f
@@ -119,6 +121,7 @@ struct mma8452_data {
int sleep_val;
u8 ctrl_reg1;
u8 data_cfg;
+ bool open_drain;
};
/**
@@ -647,6 +650,22 @@ static int mma8452_set_power_mode(struct mma8452_data *data, u8 mode)
return mma8452_change_config(data, MMA8452_CTRL_REG2, reg);
}
+static int mma8452_set_interrupt_pin_mode(struct mma8452_data *data)
+{
+ int reg;
+
+ reg = i2c_smbus_read_byte_data(data->client, MMA8452_CTRL_REG3);
+ if (reg < 0)
+ return reg;
+
+ if (data->open_drain)
+ reg |= MMA8452_CTRL_REG3_PP_OD;
+ else
+ reg &= ~MMA8452_CTRL_REG3_PP_OD;
+
+ return i2c_smbus_write_byte_data(data->client, MMA8452_CTRL_REG3, reg);
+}
+
/* returns >0 if in freefall mode, 0 if not or <0 if an error occurred */
static int mma8452_freefall_mode_enabled(struct mma8452_data *data)
{
@@ -1667,6 +1686,11 @@ static int mma8452_probe(struct i2c_client *client)
goto disable_regulators;
}
+ data->open_drain = device_property_read_bool(&client->dev, "drive-open-drain");
+ ret = mma8452_set_interrupt_pin_mode(data);
+ if (ret)
+ goto trigger_cleanup;
+
data->ctrl_reg1 = MMA8452_CTRL_ACTIVE |
(MMA8452_CTRL_DR_DEFAULT << MMA8452_CTRL_DR_SHIFT);
@@ -1688,7 +1712,7 @@ static int mma8452_probe(struct i2c_client *client)
irq_flags = irq_get_trigger_type(client->irq);
if (irq_flags == IRQ_TYPE_NONE)
irq_flags = IRQF_TRIGGER_LOW;
- irq_flags |= IRQF_ONESHOT;
+ irq_flags |= IRQF_ONESHOT | IRQF_SHARED;
ret = request_threaded_irq(client->irq, NULL, mma8452_interrupt,
irq_flags, client->name, indio_dev);
if (ret)
@@ -1806,6 +1830,10 @@ static int mma8452_runtime_resume(struct device *dev)
return ret;
}
+ ret = mma8452_set_interrupt_pin_mode(data);
+ if (ret)
+ goto runtime_resume_failed;
+
ret = mma8452_active(data);
if (ret < 0)
goto runtime_resume_failed;
--
2.55.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/4] iio: accel: mma8452: Optimize struct mm8452_data member orders
2026-08-05 7:21 ` [PATCH v3 2/4] iio: accel: mma8452: Optimize struct mm8452_data member orders Esben Haabendal
@ 2026-08-10 19:47 ` Andy Shevchenko
0 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2026-08-10 19:47 UTC (permalink / raw)
To: Esben Haabendal
Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger, linux-iio, devicetree, linux-kernel,
Joshua Crofts
On Wed, Aug 05, 2026 at 09:21:36AM +0200, Esben Haabendal wrote:
> Reorder struct mma8452_data members to avoid holes.
Would be nice to have before and after `pahole` (only few lines) summary.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware
2026-08-05 7:21 ` [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware Esben Haabendal
@ 2026-08-10 19:50 ` Andy Shevchenko
2026-08-12 13:23 ` Esben Haabendal
0 siblings, 1 reply; 9+ messages in thread
From: Andy Shevchenko @ 2026-08-10 19:50 UTC (permalink / raw)
To: Esben Haabendal
Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger, linux-iio, devicetree, linux-kernel
On Wed, Aug 05, 2026 at 09:21:37AM +0200, Esben Haabendal wrote:
> Instead of unconditionally overriding the trigger type, it is better to
> only apply a default when no trigger type is set by firmware. This should
> be reasonably backward compatible, and should only potentially cause
> problems if systems exist where firmware specifies an incorrect trigger
> type. With a bit of luck, there are no such systems.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
...
> if (client->irq) {
> + unsigned long irq_flags;
> +
> + irq_flags = irq_get_trigger_type(client->irq);
> + if (irq_flags == IRQ_TYPE_NONE)
> + irq_flags = IRQF_TRIGGER_LOW;
I would even add info message or so that FW lacks of the proper IRQ type.
But it's up to you, most of the code that I saw and does something similar
does not print anything in this case.
> + irq_flags |= IRQF_ONESHOT;
> ret = request_threaded_irq(client->irq, NULL, mma8452_interrupt,
> - IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> - client->name, indio_dev);
> + irq_flags, client->name, indio_dev);
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 4/4] iio: accel: mma8452: Allow open drain interrupt pin configuration
2026-08-05 7:21 ` [PATCH v3 4/4] iio: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
@ 2026-08-10 19:51 ` Andy Shevchenko
0 siblings, 0 replies; 9+ messages in thread
From: Andy Shevchenko @ 2026-08-10 19:51 UTC (permalink / raw)
To: Esben Haabendal
Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger, linux-iio, devicetree, linux-kernel
On Wed, Aug 05, 2026 at 09:21:38AM +0200, Esben Haabendal wrote:
> When sharing interrupt line with other chips, the interrupt pin most
> likely needs to be configured in open-drain mode instead of push-pull.
>
> The PP_OD bit in CTRL_REG3 is set when open-drain mode is configured,
> allowing sharing the interrupt line with other devices (with same interrupt
> polarity).
> The IRQF_SHARED flag is added to request_threaded_irq() flags, indicating
> that the interrupt line can be shared with other devices.
OK!
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware
2026-08-10 19:50 ` Andy Shevchenko
@ 2026-08-12 13:23 ` Esben Haabendal
0 siblings, 0 replies; 9+ messages in thread
From: Esben Haabendal @ 2026-08-12 13:23 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Martin Kepplinger,
Sean Nyekjaer, David Lechner, Nuno Sá, Andy Shevchenko,
Martin Kepplinger, linux-iio, devicetree, linux-kernel
"Andy Shevchenko" <andriy.shevchenko@intel.com> writes:
> On Wed, Aug 05, 2026 at 09:21:37AM +0200, Esben Haabendal wrote:
>> Instead of unconditionally overriding the trigger type, it is better to
>> only apply a default when no trigger type is set by firmware. This should
>> be reasonably backward compatible, and should only potentially cause
>> problems if systems exist where firmware specifies an incorrect trigger
>> type. With a bit of luck, there are no such systems.
>
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
>
> ...
>
>> if (client->irq) {
>> + unsigned long irq_flags;
>> +
>> + irq_flags = irq_get_trigger_type(client->irq);
>> + if (irq_flags == IRQ_TYPE_NONE)
>> + irq_flags = IRQF_TRIGGER_LOW;
>
> I would even add info message or so that FW lacks of the proper IRQ type.
> But it's up to you, most of the code that I saw and does something similar
> does not print anything in this case.
I agree. That seems like a nice improvement. I will add that for v4.
>> + irq_flags |= IRQF_ONESHOT;
>> ret = request_threaded_irq(client->irq, NULL, mma8452_interrupt,
>> - IRQF_TRIGGER_LOW | IRQF_ONESHOT,
>> - client->name, indio_dev);
>> + irq_flags, client->name, indio_dev);
/Esben
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-08-12 13:24 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-05 7:21 [PATCH v3 0/4] io: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 1/4] dt-bindings: iio: accel: mma8452: Add drive-open-drain Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 2/4] iio: accel: mma8452: Optimize struct mm8452_data member orders Esben Haabendal
2026-08-10 19:47 ` Andy Shevchenko
2026-08-05 7:21 ` [PATCH v3 3/4] iio: accel: mma8452: Only apply trigger type when not set by firmware Esben Haabendal
2026-08-10 19:50 ` Andy Shevchenko
2026-08-12 13:23 ` Esben Haabendal
2026-08-05 7:21 ` [PATCH v3 4/4] iio: accel: mma8452: Allow open drain interrupt pin configuration Esben Haabendal
2026-08-10 19:51 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox