Re: [PATCH] iio: proximity: sx9310: keep the IRQ balanced across suspend and resume
From: Andy Shevchenko
Date: Mon Oct 26 2026 - 06:46:27 EST
On Mon, Oct 26, 2026 at 03:33:19PM +0530, Arnav Kapoor wrote:
> 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. Without an interrupt line,
> client->irq is 0 and both callbacks act on IRQ 0, which the driver
> doesn't own.
>
> Disable the interrupt only once the device is asleep, always enable it
> in resume, and skip both when there is no interrupt.
...
> static int sx9310_resume(struct device *dev)
> scoped_guard(mutex, &data->mutex) {
> ret = regmap_write(data->regmap, SX9310_REG_PAUSE, 1);
> - if (ret)
> - return ret;
> -
> - ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
> - data->suspend_ctrl);
> - if (ret)
> - return ret;
> + if (!ret)
Can't we rather move to guard()() and use normal sequence here? It might
require to have this be moved to another helper function.
> + ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
> + data->suspend_ctrl);
> }
>
> - enable_irq(data->client->irq);
> - return 0;
> + /* Balance the suspend even if the device couldn't be woken up. */
> + if (data->client->irq)
> + enable_irq(data->client->irq);
> +
> + return ret;
> }
--
With Best Regards,
Andy Shevchenko