[PATCH v5 3/7] gpio: davinci: use irqdomain
Linus Walleij
linus.walleij at linaro.org
Tue Nov 19 15:34:09 EST 2013
On Tue, Nov 19, 2013 at 5:22 PM, Grygorii Strashko
<grygorii.strashko at ti.com> wrote:
> On 11/19/2013 01:06 AM, Linus Walleij wrote:
>> The problem that appear is if someone is using platform data-provided
>> IRQs off the irq_chip without calling gpio_to_irq() on the GPIO line
>> first. This has been determined to be legal to do, so preferably
>> create the map when registering the lines.
>
> Ok, I understand. It may fail in case if someone will define/calculate
> IRQ number for device manually in board code, like:
> dev_irq = (DA850_N_CP_INTC_IRQ + gpioN)
Usually people just hardcode the IRQ value or use some
#define, like they have often also done with GPIO numbers ...
> Also, looks like It is possible to fail if Main/arch IRQ controller
> code doesn't make call of irq_alloc_descs() during init, so
> allocated_irqs will be empty.
If you use irq_domain_add_simple() the irqdomain core
will actually attempt to do this.
But if you use a linear domain, you have to create these
irqdescs as you go. The simplest way to do this is to call
irq_create_mapping() on all IRQs, because that call will
also allocate some descriptor.
> Before recommending that, I've checked Davinci platform code and didn't
> find any risk places - BUT, Seems my findings need to be confirmed by
> Sekhar.
It's no big deal, but I just want you to be aware that this
may cause a problem at some point.
>> I think you should try to keep the 5 irqdomains, but whatever
>> gives the simplest code is usually the right answer, and
>> divide-and-conquer (split down the problem) is usually a good
>> idea.
>>
>> How the GPIO block(s) are represented in the device tree is
>> another totally separate issue about hardware description,
>> do not let the device tree model your driver structure.
>
>
> Thanks for you comments, but looks like I have to be more specific :)
>
> How irq_find_host() will look for proper IRQ domain in our case?
> And will it work at all, taking into account that all (5) IRQ domains
> will have the same value of "of_node" property?
> of_irq_to_resource()
> |-irq_of_parse_and_map()
> |-irq_create_of_mapping()
> |-irq_find_host(irq_data->np)
> where np will point on GPIO node.
>
> As result my question is about what do DT core frameworks allow or not
> allow to do? And according to that implementation of driver can be
> changed.
Hm, I'm not like a super-expert on the interrupt core, but maybe
you need to create subnodes inside the top node to represent this,
then use of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
to populate them from the main node.
Yours,
Linus Walleij
More information about the linux-arm-kernel
mailing list