* [PATCH v4 0/3] iio: proximity: sx93xx: keep the IRQ balanced across suspend and resume
@ 2026-11-01 10:25 Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 1/3] iio: proximity: sx9310: " Arnav Kapoor
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Arnav Kapoor @ 2026-11-01 10:25 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Andy Shevchenko, Gwendal Grignou, Joshua Crofts,
linux-iio, linux-kernel, Arnav Kapoor
sx9310, sx9324 and sx9360 disable the interrupt in suspend before
anything that can fail, and don't enable it again when suspend or resume
fails. One patch per driver, as the Fixes tags differ.
Changes in v4:
- Enable the interrupt first in resume, so resume mirrors suspend
(Jonathan). This also drops the sx9310_wake_up() helper from v3.
- Drop the IRQ 0 wording from the commit messages (Jonathan)
- Drop Joshua's Reviewed-by, as resume changed
v3: https://lore.kernel.org/all/20261028220444.70121-1-kapoorarnav43@gmail.com/
v2: https://lore.kernel.org/all/20261026112342.65917-1-kapoorarnav43@gmail.com/
v1:
https://lore.kernel.org/all/20261026100322.16720-1-kapoorarnav43@gmail.com/
https://lore.kernel.org/all/20261026100408.16874-1-kapoorarnav43@gmail.com/
https://lore.kernel.org/all/20261026100450.17023-1-kapoorarnav43@gmail.com/
Compile-tested only (W=1); I don't have the hardware and haven't
reproduced a failing suspend.
Arnav Kapoor (3):
iio: proximity: sx9310: keep the IRQ balanced across suspend and
resume
iio: proximity: sx9324: keep the IRQ balanced across suspend and
resume
iio: proximity: sx9360: keep the IRQ balanced across suspend and
resume
drivers/iio/proximity/sx9310.c | 32 ++++++++++++++++++--------------
drivers/iio/proximity/sx9324.c | 28 ++++++++++++++++------------
drivers/iio/proximity/sx9360.c | 30 +++++++++++++++++-------------
3 files changed, 51 insertions(+), 39 deletions(-)
base-commit: 2ef6f5c4ee56e90c237c5f7687f09e635f7d30a9
--
2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 1/3] iio: proximity: sx9310: keep the IRQ balanced across suspend and resume
2026-11-01 10:25 [PATCH v4 0/3] iio: proximity: sx93xx: keep the IRQ balanced across suspend and resume Arnav Kapoor
@ 2026-11-01 10:25 ` Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 2/3] iio: proximity: sx9324: " Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 3/3] iio: proximity: sx9360: " Arnav Kapoor
2 siblings, 0 replies; 4+ messages in thread
From: Arnav Kapoor @ 2026-11-01 10:25 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Andy Shevchenko, Gwendal Grignou, Joshua Crofts,
linux-iio, linux-kernel, Arnav Kapoor
sx9310_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. sx9310_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: 72ad02b15d63 ("iio: Add SEMTECH SX9310/9311 sensor driver")
Signed-off-by: Arnav Kapoor <kapoorarnav43@gmail.com>
---
drivers/iio/proximity/sx9310.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 79ba46d8a0aa..373037ca67d1 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -943,8 +943,6 @@ static int sx9310_suspend(struct device *dev)
u8 ctrl0;
int ret;
- disable_irq_nosync(data->client->irq);
-
guard(mutex)(&data->mutex);
ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0,
&data->suspend_ctrl);
@@ -956,27 +954,33 @@ static int sx9310_suspend(struct device *dev)
if (ret)
return ret;
- return regmap_write(data->regmap, SX9310_REG_PAUSE, 0);
+ ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 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 sx9310_resume(struct device *dev)
{
struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
+ struct regmap *map = data->regmap;
int ret;
- scoped_guard(mutex, &data->mutex) {
- ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1);
- if (ret)
- return ret;
+ if (data->client->irq)
+ enable_irq(data->client->irq);
- ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
- data->suspend_ctrl);
- if (ret)
- return ret;
- }
+ guard(mutex)(&data->mutex);
- enable_irq(data->client->irq);
- return 0;
+ ret = regmap_write(map, SX9310_REG_PAUSE, 1);
+ if (ret)
+ return ret;
+
+ return regmap_write(map, SX9310_REG_PROX_CTRL0, data->suspend_ctrl);
}
static DEFINE_SIMPLE_DEV_PM_OPS(sx9310_pm_ops, sx9310_suspend, sx9310_resume);
--
2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 2/3] iio: proximity: sx9324: keep the IRQ balanced across suspend and resume
2026-11-01 10:25 [PATCH v4 0/3] iio: proximity: sx93xx: keep the IRQ balanced across suspend and resume Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 1/3] iio: proximity: sx9310: " Arnav Kapoor
@ 2026-11-01 10:25 ` Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 3/3] iio: proximity: sx9360: " Arnav Kapoor
2 siblings, 0 replies; 4+ messages in thread
From: Arnav Kapoor @ 2026-11-01 10:25 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Andy Shevchenko, Gwendal Grignou, Joshua Crofts,
linux-iio, linux-kernel, Arnav Kapoor
sx9324_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. sx9324_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: 4c18a890dff8 ("iio:proximity:sx9324: Add SX9324 support")
Signed-off-by: Arnav Kapoor <kapoorarnav43@gmail.com>
---
drivers/iio/proximity/sx9324.c | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/drivers/iio/proximity/sx9324.c b/drivers/iio/proximity/sx9324.c
index 255a36976ac4..a76c49dda354 100644
--- a/drivers/iio/proximity/sx9324.c
+++ b/drivers/iio/proximity/sx9324.c
@@ -1088,8 +1088,6 @@ static int sx9324_suspend(struct device *dev)
unsigned int regval;
int ret;
- disable_irq_nosync(data->client->irq);
-
guard(mutex)(&data->mutex);
ret = regmap_read(data->regmap, SX9324_REG_GNRL_CTRL1, ®val);
if (ret < 0)
@@ -1100,23 +1098,29 @@ static int sx9324_suspend(struct device *dev)
/* Disable all phases, send the device to sleep. */
- return regmap_write(data->regmap, SX9324_REG_GNRL_CTRL1, 0);
+ ret = regmap_write(data->regmap, SX9324_REG_GNRL_CTRL1, 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 sx9324_resume(struct device *dev)
{
struct sx_common_data *data = iio_priv(dev_get_drvdata(dev));
- scoped_guard(mutex, &data->mutex) {
- int ret = regmap_write(data->regmap, SX9324_REG_GNRL_CTRL1,
- data->suspend_ctrl |
- SX9324_REG_GNRL_CTRL1_PAUSECTRL);
- if (ret)
- return ret;
- }
+ if (data->client->irq)
+ enable_irq(data->client->irq);
- enable_irq(data->client->irq);
- return 0;
+ guard(mutex)(&data->mutex);
+
+ return regmap_write(data->regmap, SX9324_REG_GNRL_CTRL1,
+ data->suspend_ctrl |
+ SX9324_REG_GNRL_CTRL1_PAUSECTRL);
}
static DEFINE_SIMPLE_DEV_PM_OPS(sx9324_pm_ops, sx9324_suspend, sx9324_resume);
--
2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 3/3] iio: proximity: sx9360: keep the IRQ balanced across suspend and resume
2026-11-01 10:25 [PATCH v4 0/3] iio: proximity: sx93xx: keep the IRQ balanced across suspend and resume Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 1/3] iio: proximity: sx9310: " Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 2/3] iio: proximity: sx9324: " Arnav Kapoor
@ 2026-11-01 10:25 ` Arnav Kapoor
2 siblings, 0 replies; 4+ messages in thread
From: Arnav Kapoor @ 2026-11-01 10:25 UTC (permalink / raw)
To: Jonathan Cameron
Cc: David Lechner, Nuno Sá,
Andy Shevchenko, Andy Shevchenko, Gwendal Grignou, Joshua Crofts,
linux-iio, linux-kernel, Arnav Kapoor
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@gmail.com>
---
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
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-11-01 10:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-01 10:25 [PATCH v4 0/3] iio: proximity: sx93xx: keep the IRQ balanced across suspend and resume Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 1/3] iio: proximity: sx9310: " Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 2/3] iio: proximity: sx9324: " Arnav Kapoor
2026-11-01 10:25 ` [PATCH v4 3/3] iio: proximity: sx9360: " Arnav Kapoor
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®