mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] iio: resolver: ad2s1210: notify trigger and clear state on fault read error
@ 2026-05-15 13:31 Stepan Ionichev
  2026-05-16 11:28 ` Jonathan Cameron
  0 siblings, 1 reply; 3+ messages in thread
From: Stepan Ionichev @ 2026-05-15 13:31 UTC (permalink / raw)
  To: jic23
  Cc: lars, Michael.Hennerich, dlechner, nuno.sa, andy, linux-iio,
	linux-kernel, sozdayvek

ad2s1210_trigger_handler() walks several scan-mask branches and uses
"goto error_ret" to land on the iio_trigger_notify_done() teardown at
the bottom of the function for every I/O error -- except the
MOD_CONFIG fault-register read, which uses a bare "return ret":

	if (st->fixed_mode == MOD_CONFIG) {
		unsigned int reg_val;

		ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, &reg_val);
		if (ret < 0)
			return ret;
		...
	}

Two problems on that path:

  - the handler returns a negative errno where the prototype expects
    an irqreturn_t (IRQ_HANDLED / IRQ_NONE), so the caller in the
    IIO core sees a value outside the enum;
  - iio_trigger_notify_done() is skipped, leaving the trigger
    busy-flag set. A single transient SPI/regmap error on the fault
    read then wedges the trigger so subsequent samples are dropped
    until the consumer is detached.

Convert the error path to "goto error_ret" so the failure path goes
through the same notify_done() teardown as every other error in the
handler.

Fixes: f9b9ff95be8c ("iio: resolver: ad2s1210: add support for adi,fixed-mode")
Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>
---
 drivers/iio/resolver/ad2s1210.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/resolver/ad2s1210.c b/drivers/iio/resolver/ad2s1210.c
index 774728c80..1be19fe8a 100644
--- a/drivers/iio/resolver/ad2s1210.c
+++ b/drivers/iio/resolver/ad2s1210.c
@@ -1334,7 +1334,7 @@ static irqreturn_t ad2s1210_trigger_handler(int irq, void *p)
 
 		ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, &reg_val);
 		if (ret < 0)
-			return ret;
+			goto error_ret;
 
 		st->sample.fault = reg_val;
 	}
-- 
2.43.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] iio: resolver: ad2s1210: notify trigger and clear state on fault read error
  2026-05-15 13:31 [PATCH] iio: resolver: ad2s1210: notify trigger and clear state on fault read error Stepan Ionichev
@ 2026-05-16 11:28 ` Jonathan Cameron
  2026-05-16 14:49   ` David Lechner
  0 siblings, 1 reply; 3+ messages in thread
From: Jonathan Cameron @ 2026-05-16 11:28 UTC (permalink / raw)
  To: Stepan Ionichev
  Cc: lars, Michael.Hennerich, dlechner, nuno.sa, andy, linux-iio,
	linux-kernel

On Fri, 15 May 2026 18:31:38 +0500
Stepan Ionichev <sozdayvek@gmail.com> wrote:

> ad2s1210_trigger_handler() walks several scan-mask branches and uses
> "goto error_ret" to land on the iio_trigger_notify_done() teardown at
> the bottom of the function for every I/O error -- except the
> MOD_CONFIG fault-register read, which uses a bare "return ret":
> 
> 	if (st->fixed_mode == MOD_CONFIG) {
> 		unsigned int reg_val;
> 
> 		ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, &reg_val);
> 		if (ret < 0)
> 			return ret;
> 		...
> 	}
> 
> Two problems on that path:
> 
>   - the handler returns a negative errno where the prototype expects
>     an irqreturn_t (IRQ_HANDLED / IRQ_NONE), so the caller in the
>     IIO core sees a value outside the enum;
>   - iio_trigger_notify_done() is skipped, leaving the trigger
>     busy-flag set. A single transient SPI/regmap error on the fault
>     read then wedges the trigger so subsequent samples are dropped
>     until the consumer is detached.
> 
> Convert the error path to "goto error_ret" so the failure path goes
> through the same notify_done() teardown as every other error in the
> handler.
> 
> Fixes: f9b9ff95be8c ("iio: resolver: ad2s1210: add support for adi,fixed-mode")
> Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>

Not related to this as the fix is good, but I was obviously half asleep
when guard() got added to this function which is full of gotos :(

If you have time could you look at factoring out helper that basically lifts
everything before trigger_notify_done() which should not be done with
the guard held - at least in this case it's not a deadlock source
as the device doesn't have any triggers!

That helper can use guard() and do direct returns to simplify the code flow.

Anyhow, this fix is good so applied and marked for stable.

> ---
>  drivers/iio/resolver/ad2s1210.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/resolver/ad2s1210.c b/drivers/iio/resolver/ad2s1210.c
> index 774728c80..1be19fe8a 100644
> --- a/drivers/iio/resolver/ad2s1210.c
> +++ b/drivers/iio/resolver/ad2s1210.c
> @@ -1334,7 +1334,7 @@ static irqreturn_t ad2s1210_trigger_handler(int irq, void *p)
>  
>  		ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, &reg_val);
>  		if (ret < 0)
> -			return ret;
> +			goto error_ret;
>  
>  		st->sample.fault = reg_val;
>  	}


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] iio: resolver: ad2s1210: notify trigger and clear state on fault read error
  2026-05-16 11:28 ` Jonathan Cameron
@ 2026-05-16 14:49   ` David Lechner
  0 siblings, 0 replies; 3+ messages in thread
From: David Lechner @ 2026-05-16 14:49 UTC (permalink / raw)
  To: Jonathan Cameron, Stepan Ionichev
  Cc: lars, Michael.Hennerich, nuno.sa, andy, linux-iio, linux-kernel

On 5/16/26 6:28 AM, Jonathan Cameron wrote:
> On Fri, 15 May 2026 18:31:38 +0500
> Stepan Ionichev <sozdayvek@gmail.com> wrote:
> 
>> ad2s1210_trigger_handler() walks several scan-mask branches and uses
>> "goto error_ret" to land on the iio_trigger_notify_done() teardown at
>> the bottom of the function for every I/O error -- except the
>> MOD_CONFIG fault-register read, which uses a bare "return ret":
>>
>> 	if (st->fixed_mode == MOD_CONFIG) {
>> 		unsigned int reg_val;
>>
>> 		ret = regmap_read(st->regmap, AD2S1210_REG_FAULT, &reg_val);
>> 		if (ret < 0)
>> 			return ret;
>> 		...
>> 	}
>>
>> Two problems on that path:
>>
>>   - the handler returns a negative errno where the prototype expects
>>     an irqreturn_t (IRQ_HANDLED / IRQ_NONE), so the caller in the
>>     IIO core sees a value outside the enum;
>>   - iio_trigger_notify_done() is skipped, leaving the trigger
>>     busy-flag set. A single transient SPI/regmap error on the fault
>>     read then wedges the trigger so subsequent samples are dropped
>>     until the consumer is detached.
>>
>> Convert the error path to "goto error_ret" so the failure path goes
>> through the same notify_done() teardown as every other error in the
>> handler.
>>
>> Fixes: f9b9ff95be8c ("iio: resolver: ad2s1210: add support for adi,fixed-mode")
>> Signed-off-by: Stepan Ionichev <sozdayvek@gmail.com>
> 
> Not related to this as the fix is good, but I was obviously half asleep
> when guard() got added to this function which is full of gotos :(
> 
> If you have time could you look at factoring out helper that basically lifts
> everything before trigger_notify_done() which should not be done with
> the guard held - at least in this case it's not a deadlock source
> as the device doesn't have any triggers!
> 
> That helper can use guard() and do direct returns to simplify the code flow.

I can do that since my name is all over the driver.

> 
> Anyhow, this fix is good so applied and marked for stable.

Reviewed-by: David Lechner <dlechner@baylibre.com>


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-05-16 14:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-15 13:31 [PATCH] iio: resolver: ad2s1210: notify trigger and clear state on fault read error Stepan Ionichev
2026-05-16 11:28 ` Jonathan Cameron
2026-05-16 14:49   ` David Lechner

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®