[PATCH v2] i2c: spacemit: fix spurious IRQ handling returning IRQ_HANDLED

Pei Xiao xiaopei01 at kylinos.cn
Fri Jul 10 02:28:45 PDT 2026



在 2026/7/10 16:50, Mukesh Savaliya 写道:
>
>
> On 7/10/2026 12:51 PM, Pei Xiao wrote:
>> When the interrupt status register reads zero, the handler should
>> return IRQ_NONE instead of IRQ_HANDLED. What the return value
>> actually feeds into is the spurious interrupt accounting in
>> note_interrupt(): falsely claiming IRQ_HANDLED defeats the "irq XX:
> note_interrupt() ? You mean to say No interrupt OR invalid interrupt
> here ? I could not understand function name. 
https://elixir.bootlin.com/linux/v7.2-rc1/source/kernel/irq/spurious.c#L222

if(unlikely
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/unlikely>(action_ret==IRQ_NONE
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/IRQ_NONE>)){ /* * If
we are seeing only the odd spurious IRQ caused by * bus asynchronicity
then don't eventually trigger an error, * otherwise the counter becomes
a doomsday timer for otherwise * working systems */ if(time_after
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/time_after>(jiffies
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/jiffies>,desc->last_unhandled
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/last_unhandled>+HZ
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/HZ>/10))
desc->irqs_unhandled
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/irqs_unhandled>=1;
else desc->irqs_unhandled
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/irqs_unhandled>++;
desc->last_unhandled
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/last_unhandled>=jiffies
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/jiffies>; } ...

if(unlikely
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/unlikely>(desc->irqs_unhandled
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/irqs_unhandled>>99900)){
/* * The interrupt is stuck */ __report_bad_irq
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/__report_bad_irq>(desc,action_ret);
/* * Now kill the IRQ */ pr_emerg
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/pr_emerg>("Disabling
IRQ #%d\n",irq); desc->istate
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/istate>|=IRQS_SPURIOUS_DISABLED
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/IRQS_SPURIOUS_DISABLED>;
desc->depth <https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/depth>++;
irq_disable
<https://elixir.bootlin.com/linux/v7.2-rc1/C/ident/irq_disable>(desc) a
stuck interrupt source would catch here.


>> nobody cared" detection, so a stuck interrupt source would never be
>> caught.
>>
>> Fixes: 5ea558473fa3 ("i2c: spacemit: add support for SpacemiT K1 SoC")
>> Signed-off-by: Pei Xiao <xiaopei01 at kylinos.cn>
>> ---
>> changlog in v2:
>> modify gitlog for Modify the incorrect Git commit message to match
>> the reason for the modification.
>> ---
>>   drivers/i2c/busses/i2c-k1.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c
>> index c2d090f6ba80..487f23fde725 100644
>> --- a/drivers/i2c/busses/i2c-k1.c
>> +++ b/drivers/i2c/busses/i2c-k1.c
>> @@ -728,7 +728,7 @@ static irqreturn_t spacemit_i2c_irq_handler(int
>> irq, void *devid)
>>         status = readl(i2c->base + SPACEMIT_ISR);
>>       if (!status)
>> -        return IRQ_HANDLED;
>> +        return IRQ_NONE;
>>         i2c->status = status;
>>   
>
>




More information about the linux-riscv mailing list