From: Stephen Warren <swarren@wwwdotorg.org>
To: Linus Walleij <linus.walleij@linaro.org>
Cc: Jon Hunter <jon-hunter@ti.com>,
Grant Likely <grant.likely@secretlab.ca>,
Alexandre Courbot <acourbot@nvidia.com>,
Javier Martinez Canillas <martinez.javier@gmail.com>,
Stephen Warren <swarren@nvidia.com>,
Kevin Hilman <khilman@deeprootsystems.com>,
"devicetree-discuss@lists.ozlabs.org"
<devicetree-discuss@lists.ozlabs.org>,
"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>,
Tarun Kanti DebBarma <tarun.kanti@ti.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 3/5] gpio/omap: Add DT support to GPIO driver
Date: Wed, 10 Apr 2013 14:29:17 -0600 [thread overview]
Message-ID: <5165CB9D.1090202@wwwdotorg.org> (raw)
In-Reply-To: <CACRpkdYbs4-uudpRUY8e+7icYYkZrfM0kReP3pLL5DMiURJ4dg@mail.gmail.com>
On 04/10/2013 12:12 PM, Linus Walleij wrote:
> On Fri, Mar 29, 2013 at 6:01 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
>> On 03/27/2013 02:55 PM, Linus Walleij wrote:
>>> On Wed, Mar 27, 2013 at 5:09 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
>>>
>>> This is the case for some SMSC911x clients like the snowball
>>> routing it to a GPIO, whereas I think the RealView and Integrator/CP
>>> has a dedicated IRQ line for it on the FPGA so it's a good example.
>>>
>>> In such cases the right thing to do is for the platform
>>> code populating the platform data with the int irq field, or device tree
>>> core, or whatever piece of code that knows about
>>> the actual GPIO shall start from the GPIO, request it and
>>> then convert it to an IRQ.
>>
>> So board code could easily do that; plenty of opportunity to put
>> whatever custom code is needed right there.
>>
>> For DT core code to do that, we'd need some alternative way of
>> specifying interrupts. That would change the DT bindings for interrupts.
>> I don't think we can do that...
>
> Sorry, I'm probably not knowledgeable about DT to understand this.
> The information for what GPIO corresponds to what IRQ is
> present in the device tree, is it not?
No, I don't think so. DT treats the IRQ and GPIO numbering spaces as
entirely unrelated things, just like the kernel APIs do.
The fact that some DT nodes (device/drivers) happen to be both GPIO and
IRQ providers (implement gpio_chip and irq_chip) and happen to use the
same numbering scheme for both GPIO and IRQ IDs is purely an
implementation detail within individual drivers (or rather, of specific
DT binding definitions really), and not a general truism.
> If the information is there, whether to convert from IRQ to GPIO
> or from GPIO to IRQ is a technicality and any order should be
> feasible in some way?
There isn't always a unique 1:1 mapping between GPIOs and IRQs. Put
another way, a single GPIO would likely only ever trigger a single IRQ,
but a single IRQ might easily be triggered by any number of GPIOs. This
is exactly why the function irq_to_gpio() isn't something one should use
any more. I think there was an effort to outright remove the API,
although it doesn't look like that's entirely complete yet. I guess you
know this given your mentions of problem with gpio_to_irq() later on, so
I'm not quite sure what your paragraph above was supposed to mean.
> I just can't get the necessity to do it one way preferred over the
> other through my head, sorry...
>
>>> If it seems like identical boilerplate in every machine we can
>>> simply centralize it to gpiolib. Something like
>>>
>>> int gpio_add_single_irq_resource(struct platform_device *pdev, int
>>> gpio, unsigned flags)
>> ... [code to convert GPIO to IRQ and create IORESOURCE_IRQ from it]
>>
>>> int gpio_populate_irq_resource(struct platform_device *pdev, int gpio,
>>> unsigned flags, struct resource *r)
>> ... [code to create IORESOURCE_IRQ from the IRQ]
>>
>> ...
>>> gpio_populate_irq_resource(ðernet, 17,
>>> IORESOURCE_IRQ_HIGHEDGE, ðernet_res[1]);
>>> platform_device_register(ðernet);
>>>
>>> That populates the device with the single GPIO IRQ from
>>> the GPIO number in a smooth way.
>>>
>>> Of course it has to be done after the GPIO driver is up
>>> and running so may require some other refactoring,
>>> but it should work.
>>
>> That latter issue also somewhat scuppers this approach; then you have to
>> somehow run a bunch of your board file code inter-mixed with various
>> driver probe() calls. That will quickly get nasy.
>
> No, just use a module_init() for the above code in the board
> file and it will defer just like any other initcall.
Using initcalls to order things is rather fragile. Perhaps it could work
out OK with board files, but it's certainly something that's frowned
upon now for DT-based systems, since deferred probe solves it much more
generally, and without any maintenance issues (e.g. continual
re-shuffling of the initcall order, not having enough initcall levels if
you end up with more dependencies being added, etc.).
>> And it doesn't address how the DT core will know when to call
>> gpio_add_single_irq_resource() vs. gpio_populate_irq_resource() without
>> changing the DT binding for interrupts.
>
> Is it not possible to do this in
> drivers/gpio/gpiolib-of.c: of_gpiochip_add(), if the DT *know*
> which GPIOs will be used as plain IRQs? That is the point with
> the gpio hogs I talk about ...
I suppose that if you modified the device tree bindings (schema
definitions), you could have every GPIO provider DT node indicate which
GPIOs were used as IRQs instead. However,
a) This would be an incompatible change to the DT bindings, and they're
supposed to be a stable ABI; old DTBs should work unmodified with new
kernels.
b) This would place GPIO usage information in multiple places. Right
now, GPIO consumers list which GPIO(s) they use. The same goes for IRQs.
If a GPIO provider started listing which GPIOs were really IRQs, then
that'd mean configuring each GPIO-as-an-IRQ in two places; once in the
client node to indicate which IRQ it should hook/register, and once in
the provider node to indicate that the GPIO is really an IRQ. Two places
is more hassle for people to implement, and more opportunity for mistakes.
WARNING: multiple messages have this Message-ID (diff)
From: swarren@wwwdotorg.org (Stephen Warren)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/5] gpio/omap: Add DT support to GPIO driver
Date: Wed, 10 Apr 2013 14:29:17 -0600 [thread overview]
Message-ID: <5165CB9D.1090202@wwwdotorg.org> (raw)
In-Reply-To: <CACRpkdYbs4-uudpRUY8e+7icYYkZrfM0kReP3pLL5DMiURJ4dg@mail.gmail.com>
On 04/10/2013 12:12 PM, Linus Walleij wrote:
> On Fri, Mar 29, 2013 at 6:01 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
>> On 03/27/2013 02:55 PM, Linus Walleij wrote:
>>> On Wed, Mar 27, 2013 at 5:09 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
>>>
>>> This is the case for some SMSC911x clients like the snowball
>>> routing it to a GPIO, whereas I think the RealView and Integrator/CP
>>> has a dedicated IRQ line for it on the FPGA so it's a good example.
>>>
>>> In such cases the right thing to do is for the platform
>>> code populating the platform data with the int irq field, or device tree
>>> core, or whatever piece of code that knows about
>>> the actual GPIO shall start from the GPIO, request it and
>>> then convert it to an IRQ.
>>
>> So board code could easily do that; plenty of opportunity to put
>> whatever custom code is needed right there.
>>
>> For DT core code to do that, we'd need some alternative way of
>> specifying interrupts. That would change the DT bindings for interrupts.
>> I don't think we can do that...
>
> Sorry, I'm probably not knowledgeable about DT to understand this.
> The information for what GPIO corresponds to what IRQ is
> present in the device tree, is it not?
No, I don't think so. DT treats the IRQ and GPIO numbering spaces as
entirely unrelated things, just like the kernel APIs do.
The fact that some DT nodes (device/drivers) happen to be both GPIO and
IRQ providers (implement gpio_chip and irq_chip) and happen to use the
same numbering scheme for both GPIO and IRQ IDs is purely an
implementation detail within individual drivers (or rather, of specific
DT binding definitions really), and not a general truism.
> If the information is there, whether to convert from IRQ to GPIO
> or from GPIO to IRQ is a technicality and any order should be
> feasible in some way?
There isn't always a unique 1:1 mapping between GPIOs and IRQs. Put
another way, a single GPIO would likely only ever trigger a single IRQ,
but a single IRQ might easily be triggered by any number of GPIOs. This
is exactly why the function irq_to_gpio() isn't something one should use
any more. I think there was an effort to outright remove the API,
although it doesn't look like that's entirely complete yet. I guess you
know this given your mentions of problem with gpio_to_irq() later on, so
I'm not quite sure what your paragraph above was supposed to mean.
> I just can't get the necessity to do it one way preferred over the
> other through my head, sorry...
>
>>> If it seems like identical boilerplate in every machine we can
>>> simply centralize it to gpiolib. Something like
>>>
>>> int gpio_add_single_irq_resource(struct platform_device *pdev, int
>>> gpio, unsigned flags)
>> ... [code to convert GPIO to IRQ and create IORESOURCE_IRQ from it]
>>
>>> int gpio_populate_irq_resource(struct platform_device *pdev, int gpio,
>>> unsigned flags, struct resource *r)
>> ... [code to create IORESOURCE_IRQ from the IRQ]
>>
>> ...
>>> gpio_populate_irq_resource(ðernet, 17,
>>> IORESOURCE_IRQ_HIGHEDGE, ðernet_res[1]);
>>> platform_device_register(ðernet);
>>>
>>> That populates the device with the single GPIO IRQ from
>>> the GPIO number in a smooth way.
>>>
>>> Of course it has to be done after the GPIO driver is up
>>> and running so may require some other refactoring,
>>> but it should work.
>>
>> That latter issue also somewhat scuppers this approach; then you have to
>> somehow run a bunch of your board file code inter-mixed with various
>> driver probe() calls. That will quickly get nasy.
>
> No, just use a module_init() for the above code in the board
> file and it will defer just like any other initcall.
Using initcalls to order things is rather fragile. Perhaps it could work
out OK with board files, but it's certainly something that's frowned
upon now for DT-based systems, since deferred probe solves it much more
generally, and without any maintenance issues (e.g. continual
re-shuffling of the initcall order, not having enough initcall levels if
you end up with more dependencies being added, etc.).
>> And it doesn't address how the DT core will know when to call
>> gpio_add_single_irq_resource() vs. gpio_populate_irq_resource() without
>> changing the DT binding for interrupts.
>
> Is it not possible to do this in
> drivers/gpio/gpiolib-of.c: of_gpiochip_add(), if the DT *know*
> which GPIOs will be used as plain IRQs? That is the point with
> the gpio hogs I talk about ...
I suppose that if you modified the device tree bindings (schema
definitions), you could have every GPIO provider DT node indicate which
GPIOs were used as IRQs instead. However,
a) This would be an incompatible change to the DT bindings, and they're
supposed to be a stable ABI; old DTBs should work unmodified with new
kernels.
b) This would place GPIO usage information in multiple places. Right
now, GPIO consumers list which GPIO(s) they use. The same goes for IRQs.
If a GPIO provider started listing which GPIOs were really IRQs, then
that'd mean configuring each GPIO-as-an-IRQ in two places; once in the
client node to indicate which IRQ it should hook/register, and once in
the provider node to indicate that the GPIO is really an IRQ. Two places
is more hassle for people to implement, and more opportunity for mistakes.
next prev parent reply other threads:[~2013-04-10 20:29 UTC|newest]
Thread overview: 190+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-15 16:04 [PATCH 0/5] gpio/omap: Cleanup and adaptation to Device Tree Benoit Cousson
2012-02-15 16:04 ` Benoit Cousson
2012-02-15 16:04 ` [PATCH 1/5] gpio/omap: Remove bank->id information and misc cleanup Benoit Cousson
2012-02-15 16:04 ` Benoit Cousson
2012-02-16 5:53 ` DebBarma, Tarun Kanti
2012-02-16 5:53 ` DebBarma, Tarun Kanti
2012-02-16 9:33 ` Cousson, Benoit
2012-02-16 9:33 ` Cousson, Benoit
2012-02-15 16:04 ` [PATCH 2/5] gpio/omap: Use devm_ API and add request_mem_region Benoit Cousson
2012-02-15 16:04 ` Benoit Cousson
2012-02-16 5:41 ` DebBarma, Tarun Kanti
2012-02-16 5:41 ` DebBarma, Tarun Kanti
2012-02-16 6:35 ` Grant Likely
2012-02-16 6:35 ` Grant Likely
2012-02-16 7:11 ` DebBarma, Tarun Kanti
2012-02-16 7:11 ` DebBarma, Tarun Kanti
2012-02-16 6:37 ` Shubhrajyoti
2012-02-16 6:37 ` Shubhrajyoti
2012-02-16 8:56 ` Cousson, Benoit
2012-02-16 8:56 ` Cousson, Benoit
2012-02-15 16:04 ` [PATCH 3/5] gpio/omap: Add DT support to GPIO driver Benoit Cousson
2012-02-15 16:04 ` Benoit Cousson
2012-02-22 14:23 ` Rob Herring
2012-02-22 14:23 ` Rob Herring
2012-02-22 14:31 ` Cousson, Benoit
2012-02-22 14:31 ` Cousson, Benoit
2012-02-22 17:23 ` Rob Herring
2012-02-22 17:23 ` Rob Herring
2012-02-22 18:29 ` Stephen Warren
2012-02-22 18:29 ` Stephen Warren
2012-02-24 15:30 ` Cousson, Benoit
2012-02-24 15:30 ` Cousson, Benoit
2013-02-26 10:01 ` Javier Martinez Canillas
2013-02-26 10:01 ` Javier Martinez Canillas
2013-02-26 16:33 ` Stephen Warren
2013-02-26 16:33 ` Stephen Warren
2013-02-26 22:40 ` Jon Hunter
2013-02-26 22:40 ` Jon Hunter
2013-02-26 22:44 ` Stephen Warren
2013-02-26 22:44 ` Stephen Warren
2013-02-26 23:01 ` Jon Hunter
2013-02-26 23:01 ` Jon Hunter
2013-02-26 23:06 ` Stephen Warren
2013-02-26 23:06 ` Stephen Warren
2013-02-26 23:45 ` Jon Hunter
2013-02-26 23:45 ` Jon Hunter
2013-02-27 0:13 ` Stephen Warren
2013-02-27 0:13 ` Stephen Warren
2013-02-27 1:07 ` Jon Hunter
2013-02-27 1:07 ` Jon Hunter
2013-02-27 3:57 ` Javier Martinez Canillas
2013-02-27 3:57 ` Javier Martinez Canillas
2013-02-27 17:50 ` Stephen Warren
2013-02-27 17:50 ` Stephen Warren
2013-02-27 20:05 ` Javier Martinez Canillas
2013-02-27 20:05 ` Javier Martinez Canillas
2013-02-27 23:16 ` Jon Hunter
2013-02-27 23:16 ` Jon Hunter
2013-02-28 12:17 ` Javier Martinez Canillas
2013-02-28 12:17 ` Javier Martinez Canillas
2013-02-28 20:49 ` Jon Hunter
2013-02-28 20:49 ` Jon Hunter
[not found] ` <512D3EC2.6050408-l0cyMroinI0@public.gmane.org>
2013-03-02 20:05 ` Grant Likely
2013-03-02 20:05 ` Grant Likely
2013-03-07 23:14 ` Jon Hunter
2013-03-07 23:14 ` Jon Hunter
2013-03-15 11:21 ` Javier Martinez Canillas
2013-03-15 11:21 ` Javier Martinez Canillas
2013-03-22 8:10 ` Linus Walleij
2013-03-22 8:10 ` Linus Walleij
2013-03-22 15:33 ` Stephen Warren
2013-03-22 15:33 ` Stephen Warren
2013-03-22 22:52 ` Jon Hunter
2013-03-22 22:52 ` Jon Hunter
2013-03-27 13:52 ` Linus Walleij
2013-03-27 13:52 ` Linus Walleij
2013-03-27 16:09 ` Stephen Warren
2013-03-27 16:09 ` Stephen Warren
2013-03-27 20:55 ` Linus Walleij
2013-03-27 20:55 ` Linus Walleij
2013-03-29 17:01 ` Stephen Warren
2013-03-29 17:01 ` Stephen Warren
2013-04-10 18:12 ` Linus Walleij
2013-04-10 18:12 ` Linus Walleij
2013-04-10 20:29 ` Stephen Warren [this message]
2013-04-10 20:29 ` Stephen Warren
2013-04-10 21:28 ` Linus Walleij
2013-04-10 21:28 ` Linus Walleij
2013-04-11 20:30 ` Stephen Warren
2013-04-11 20:30 ` Stephen Warren
2013-04-11 22:16 ` Linus Walleij
2013-04-11 22:16 ` Linus Walleij
2013-04-11 22:47 ` Stephen Warren
2013-04-11 22:47 ` Stephen Warren
2013-04-14 1:35 ` Javier Martinez Canillas
2013-04-14 1:35 ` Javier Martinez Canillas
2013-04-14 20:53 ` Linus Walleij
2013-04-14 20:53 ` Linus Walleij
2013-04-15 11:25 ` Javier Martinez Canillas
2013-04-15 11:25 ` Javier Martinez Canillas
2013-04-15 16:58 ` Stephen Warren
2013-04-15 16:58 ` Stephen Warren
[not found] ` <516C73C6.5050409@ti.co m>
2013-04-15 21:40 ` Jon Hunter
2013-04-15 21:40 ` Jon Hunter
2013-04-15 21:44 ` Jon Hunter
2013-04-15 21:44 ` Jon Hunter
2013-04-15 22:16 ` Stephen Warren
2013-04-15 22:16 ` Stephen Warren
2013-04-15 23:04 ` Jon Hunter
2013-04-15 23:04 ` Jon Hunter
2013-04-16 18:40 ` Stephen Warren
2013-04-16 18:40 ` Stephen Warren
2013-04-16 19:27 ` Jon Hunter
2013-04-16 19:27 ` Jon Hunter
2013-04-16 21:57 ` Jon Hunter
2013-04-16 21:57 ` Jon Hunter
2013-04-16 22:11 ` Stephen Warren
2013-04-16 22:11 ` Stephen Warren
2013-04-16 23:14 ` Jon Hunter
2013-04-16 23:14 ` Jon Hunter
2013-04-17 0:41 ` Javier Martinez Canillas
2013-04-17 0:41 ` Javier Martinez Canillas
2013-04-17 2:00 ` Jon Hunter
2013-04-17 2:00 ` Jon Hunter
2013-04-17 7:55 ` Javier Martinez Canillas
2013-04-17 7:55 ` Javier Martinez Canillas
[not found] ` <CAAwP0s2M2pnSydyDvh_rejFO=w8bCo4WE5PkxrYuk0HQDixc-Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-17 13:25 ` Jon Hunter
2013-04-17 13:25 ` Jon Hunter
2013-04-17 13:42 ` Javier Martinez Canillas
2013-04-17 13:42 ` Javier Martinez Canillas
[not found] ` <CAAwP0s2DsJAWuXWvPAkzCT0T0AG_OvMEw2sADW6LqSi1Ofd_Zw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-17 13:52 ` Jon Hunter
2013-04-17 13:52 ` Jon Hunter
2013-04-17 14:21 ` Javier Martinez Canillas
2013-04-17 14:21 ` Javier Martinez Canillas
2013-04-17 16:18 ` Javier Martinez Canillas
2013-04-17 16:18 ` Javier Martinez Canillas
2013-04-26 7:31 ` Linus Walleij
2013-04-26 7:31 ` Linus Walleij
2013-04-26 21:31 ` Jon Hunter
2013-04-26 21:31 ` Jon Hunter
2013-06-11 21:25 ` Grant Likely
2013-06-11 21:25 ` Grant Likely
2013-06-12 9:43 ` Linus Walleij
2013-06-12 9:43 ` Linus Walleij
2013-04-17 15:41 ` Stephen Warren
2013-04-17 15:41 ` Stephen Warren
2013-04-26 7:27 ` Linus Walleij
2013-04-26 7:27 ` Linus Walleij
2013-04-26 21:25 ` Jon Hunter
2013-04-26 21:25 ` Jon Hunter
[not found] ` <517AF0C1.60009-l0cyMroinI0@public.gmane.org>
2013-05-03 14:35 ` Linus Walleij
2013-05-03 14:35 ` Linus Walleij
2013-04-26 7:11 ` Linus Walleij
2013-04-26 7:11 ` Linus Walleij
2013-04-26 6:59 ` Linus Walleij
2013-04-26 6:59 ` Linus Walleij
2013-04-15 16:53 ` Stephen Warren
2013-04-15 16:53 ` Stephen Warren
2013-04-15 20:00 ` Jon Hunter
2013-04-15 20:00 ` Jon Hunter
2013-04-11 22:49 ` Javier Martinez Canillas
2013-04-11 22:49 ` Javier Martinez Canillas
2013-04-11 22:51 ` Stephen Warren
2013-04-11 22:51 ` Stephen Warren
2013-04-10 21:44 ` Arnd Bergmann
2013-04-10 21:44 ` Arnd Bergmann
2013-02-27 3:33 ` Javier Martinez Canillas
2013-02-27 3:33 ` Javier Martinez Canillas
2013-02-27 17:47 ` Stephen Warren
2013-02-27 17:47 ` Stephen Warren
2013-02-27 20:00 ` Javier Martinez Canillas
2013-02-27 20:00 ` Javier Martinez Canillas
2013-02-26 23:08 ` Jon Hunter
2013-02-26 23:08 ` Jon Hunter
2013-02-27 3:47 ` Javier Martinez Canillas
2013-02-27 3:47 ` Javier Martinez Canillas
2013-02-27 20:13 ` Jon Hunter
2013-02-27 20:13 ` Jon Hunter
2013-02-27 23:41 ` Linus Walleij
2013-02-27 23:41 ` Linus Walleij
2013-02-28 13:04 ` Benoit Cousson
2013-02-28 13:04 ` Benoit Cousson
2013-03-01 0:09 ` Linus Walleij
2013-03-01 0:09 ` Linus Walleij
2013-03-01 0:42 ` Jon Hunter
2013-03-01 0:42 ` Jon Hunter
2012-02-15 16:04 ` [PATCH 4/5] arm/dts: OMAP4: Add gpio nodes Benoit Cousson
2012-02-15 16:04 ` Benoit Cousson
2012-02-15 16:04 ` [PATCH 5/5] arm/dts: OMAP3: " Benoit Cousson
2012-02-15 16:04 ` Benoit Cousson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5165CB9D.1090202@wwwdotorg.org \
--to=swarren@wwwdotorg.org \
--cc=acourbot@nvidia.com \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=grant.likely@secretlab.ca \
--cc=jon-hunter@ti.com \
--cc=khilman@deeprootsystems.com \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=martinez.javier@gmail.com \
--cc=swarren@nvidia.com \
--cc=tarun.kanti@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.