[PATCH v4 3/3] iio: proximity: sx9360: keep the IRQ balanced across suspend and resume
From: Arnav Kapoor
Date: Sun Nov 01 2026 - 05:26:24 EST
sx9360_suspend() disables the interrupt first and returns with it still
disabled if a register access fails. Resume isn't called after a failed
suspend, so the interrupt is never enabled again. sx9360_resume() also
returns without enabling it on error.
Make the two mirror images: disable the interrupt as the last step of
suspend and enable it as the first step of resume, before anything can
fail. The driver works without an interrupt line, so skip both calls
when client->irq is 0, as sx_common already does.
Fixes: 1cdb4c47f7f5 ("iio:proximity:sx9360: Add sx9360 support")
Signed-off-by: Arnav Kapoor <kapoorarnav43@xxxxxxxxx>
---
drivers/iio/proximity/sx9360.c | 30 +++++++++++++++++-------------
1 file changed, 17 insertions(+), 13 deletions(-)
diff --git a/drivers/iio/proximity/sx9360.c b/drivers/iio/proximity/sx9360.c
index ed83d809ecf5..f89c556e0989 100644
--- a/drivers/iio/proximity/sx9360.c
+++ b/drivers/iio/proximity/sx9360.c
@@ -797,8 +797,6 @@ static int sx9360_suspend(struct device *dev)
unsigned int regval;
int ret;
- disable_irq_nosync(data->client->irq);
-
guard(mutex)(&data->mutex);
ret = regmap_read(data->regmap, SX9360_REG_GNRL_CTRL0, ®val);
if (ret < 0)
@@ -809,23 +807,29 @@ static int sx9360_suspend(struct device *dev)
/* Disable all phases, send the device to sleep. */
- return regmap_write(data->regmap, SX9360_REG_GNRL_CTRL0, 0);
+ ret = regmap_write(data->regmap, SX9360_REG_GNRL_CTRL0, 0);
+ if (ret)
+ return ret;
+
+ /* Last, as resume isn't called if suspend fails. */
+ if (data->client->irq)
+ disable_irq_nosync(data->client->irq);
+
+ return 0;
}
static int sx9360_resume(struct device *dev)
{
struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
- scoped_guard(mutex, &data->mutex) {
- int ret = regmap_update_bits(data->regmap,
- SX9360_REG_GNRL_CTRL0,
- SX9360_REG_GNRL_CTRL0_PHEN_MASK,
- data->suspend_ctrl);
- if (ret)
- return ret;
- }
- enable_irq(data->client->irq);
- return 0;
+ if (data->client->irq)
+ enable_irq(data->client->irq);
+
+ guard(mutex)(&data->mutex);
+
+ return regmap_update_bits(data->regmap, SX9360_REG_GNRL_CTRL0,
+ SX9360_REG_GNRL_CTRL0_PHEN_MASK,
+ data->suspend_ctrl);
}
static DEFINE_SIMPLE_DEV_PM_OPS(sx9360_pm_ops, sx9360_suspend, sx9360_resume);
--
2.53.0