Hi Gregory,

On 08/01/2013 09:58, Gregory CLEMENT wrote:
> On 01/08/2013 09:32 AM, Maxime Ripard wrote:
>> On 07/01/2013 23:51, Gregory CLEMENT wrote:
>>>  static irqreturn_t pca953x_irq_handler(int irq, void *devid)
>>>  {
>>>     struct pca953x_chip *chip = devid;
>>> -   u32 pending;
>>> -   u32 level;
>>> +   u8 pending[MAX_BANK];
>>> +   u8 level;
>>> +   int i;
>>>  
>>> -   pending = pca953x_irq_pending(chip);
>>> -
>>> -   if (!pending)
>>> +   if (!pca953x_irq_pending(chip, pending))
>>>             return IRQ_HANDLED;
>>>  
>>> -   do {
>>> -           level = __ffs(pending);
>>> -           handle_nested_irq(irq_find_mapping(chip->domain, level));
>>> -
>>> -           pending &= ~(1 << level);
>>> -   } while (pending);
>>> +   for (i = 0; i < NBANK(chip); i++) {
>>> +           do {
>>> +                   level = __ffs(pending[i]);
>>> +                   handle_nested_irq(irq_find_mapping(chip->domain,
>>> +                                                   level + (BANK_SZ * i)));
>>> +                   pending[i] &= ~(1 << level);
>>> +           } while (pending[i]);
>>> +   }
>>>  
>>>     return IRQ_HANDLED;
>>>  }
>>
>> This triggers the following warning when an interrupt is raised:
>>
>> [   30.773500] ------------[ cut here ]------------
>> [   30.778843] WARNING: at /home/tmp/linux/kernel/irq/irqdomain.c:137 
>> irq_domain_legacy_revmap+0x2c/0x48()
>> [   30.788375] Modules linked in:
>> [   30.791531] [<c0014100>] (unwind_backtrace+0x0/0xf0) from [<c001c878>] 
>> (warn_slowpath_common+0x4c/0x64)
>> [   30.801125] [<c001c878>] (warn_slowpath_common+0x4c/0x64) from 
>> [<c001c8ac>] (warn_slowpath_null+0x1c/0x24)
>> [   30.810968] [<c001c8ac>] (warn_slowpath_null+0x1c/0x24) from [<c006b5e0>] 
>> (irq_domain_legacy_revmap+0x2c/0x48)
>> [   30.821187] [<c006b5e0>] (irq_domain_legacy_revmap+0x2c/0x48) from 
>> [<c01c3734>] (pca953x_irq_handler+0x16c/0x1ac)
>> [   30.831656] [<c01c3734>] (pca953x_irq_handler+0x16c/0x1ac) from 
>> [<c0068688>] (irq_thread+0xd0/0x124)
>> [   30.841000] [<c0068688>] (irq_thread+0xd0/0x124) from [<c003c238>] 
>> (kthread+0xa4/0xb0)
>> [   30.849125] [<c003c238>] (kthread+0xa4/0xb0) from [<c000ed48>] 
>> (ret_from_fork+0x14/0x2c)
>> [   30.857375] ---[ end trace 09584b7a73100a49 ]---
>>
> 
> Humm it seems that this warning is caused by attempting to use an out of 
> range hwirq.
> I need to investigate it more in details.
> 
> Expect the IRQ part, is this version is working for your gpio expander?

Yes, it works fine if you leave the interruptions aside.

Maxime

-- 
Maxime Ripard, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to