From: Thierry Reding <thierry.reding@gmail.com>
To: "Strashko, Grygorii" <grygorii.strashko@ti.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Linus Walleij <linus.walleij@linaro.org>,
Stephen Warren <swarren@wwwdotorg.org>,
Wolfram Sang <wsa@the-dreams.de>,
Grant Likely <grant.likely@linaro.org>,
Rob Herring <rob.herring@calxeda.com>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Thomas Gleixner <tglx@linutronix.de>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-gpio@vger.kernel.org" <linux-gpio@vger.kernel.org>,
"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>,
"linux-i2c@vger.kernel.org" <linux-i2c@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>
Subject: Re: [PATCH 7/9] of/platform: Resolve interrupt references at probe time
Date: Wed, 18 Sep 2013 12:43:36 +0200 [thread overview]
Message-ID: <20130918104335.GA8256@ulmo> (raw)
In-Reply-To: <902E09E6452B0E43903E4F2D568737AB363BD3@DNCE04.ent.ti.com>
[-- Attachment #1: Type: text/plain, Size: 3850 bytes --]
On Tue, Sep 17, 2013 at 01:04:06PM +0000, Strashko, Grygorii wrote:
> Hi Thierry,
>
> On 09/16/2013 11:32 AM, Thierry Reding wrote:> Interrupt references are currently resolved very early (when a device is
> > created). This has the disadvantage that it will fail in cases where the
> > interrupt parent hasn't been probed and no IRQ domain for it has been
> > registered yet. To work around that various drivers use explicit
> > initcall ordering to force interrupt parents to be probed before devices
> > that need them are created. That's error prone and doesn't always work.
> > If a platform device uses an interrupt line connected to a different
> > platform device (such as a GPIO controller), both will be created in the
> > same batch, and the GPIO controller won't have been probed by its driver
> > when the depending platform device is created. Interrupt resolution will
> > fail in that case.
> >
> > Another common workaround is for drivers to explicitly resolve interrupt
> > references at probe time. This is suboptimal, however, because it will
> > require every driver to duplicate the code.
> >
> > This patch adds support for late interrupt resolution to the platform
> > driver core, by resolving the references right before a device driver's
> > .probe() function will be called. This not only delays the resolution
> > until a much later time (giving interrupt parents a better chance of
> > being probed in the meantime), but it also allows the platform driver
> > core to queue the device for deferred probing if the interrupt parent
> > hasn't registered its IRQ domain yet.
> >
> > Signed-off-by: Thierry Reding <treding@nvidia.com>
> > ---
> > drivers/base/platform.c | 4 ++++
> > drivers/of/platform.c | 43 +++++++++++++++++++++++++++++++++++++------
> > include/linux/of_platform.h | 7 +++++++
> > 3 files changed, 48 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/base/platform.c b/drivers/base/platform.c
> > index 4f8bef3..8dcf835 100644
> > --- a/drivers/base/platform.c
> > +++ b/drivers/base/platform.c
> > @@ -481,6 +481,10 @@ static int platform_drv_probe(struct device *_dev)
>
> Should it be the part of really_probe()? Isn't it?
really_probe() takes a struct device and is in fact called by all types
of devices. This code, however, is highly platform_device specific, so I
don't think we can do it in really_probe().
Unfortunately every device type has its own way of storing interrupts.
Platform devices store them as resources, I2C clients store them as a
separate field in struct i2c_client, etc.
> > +int of_platform_probe(struct platform_device *pdev)
> > +{
> > + struct device_node *np = pdev->dev.of_node;
> > + int num_irq, ret = 0;
> > +
> > + if (!pdev->dev.of_node)
> > + return 0;
> > +
> > + num_irq = of_irq_count(pdev->dev.of_node);
> > + if (num_irq > 0) {
> > + struct resource *res = pdev->resource;
> > + int num_reg = pdev->num_resources;
> > + int num = num_reg + num_irq;
> > +
> > + res = krealloc(res, num * sizeof(*res), GFP_KERNEL);
> > + if (!res)
> > + return -ENOMEM;
> > +
> > + pdev->num_resources = num;
> > + pdev->resource = res;
> > + res += num_reg;
>
> What will happen if Driver probe is failed or deferred?
> Seems resource table size will grow each time the Driver probe is
> deferred or failed.
That's a very good point. I think what we can do is check whether the
total number of resources that the device has (pdev->num_resources)
corresponds to num_reg + num_irq and skip in that case. That and...
> > + ret = of_irq_to_resource_table(np, res, num_irq);
> > + if (ret < 0)
> > + return ret;
... updating pdev->num_resources after this point should cover all
cases. Do you see any other potential problems?
Thierry
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
next prev parent reply other threads:[~2013-09-18 10:44 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-16 8:31 [PATCH 0/9] of/irq: Defer interrupt reference resolution Thierry Reding
[not found] ` <1379320326-13241-1-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-16 8:31 ` [PATCH 1/9] of/irq: Rework of_irq_count() Thierry Reding
2013-09-16 8:31 ` Thierry Reding
2013-09-16 8:31 ` [PATCH 2/9] irqdomain: Introduce __irq_create_mapping() Thierry Reding
2013-09-23 19:14 ` Linus Walleij
2013-09-23 20:29 ` Thierry Reding
2013-09-24 12:20 ` Linus Walleij
[not found] ` <CACRpkdZMM9RUkRCWG0mYbF9PL-fOdDncpY05xG3F5BF55hn5ug-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-24 18:28 ` Thierry Reding
2013-09-24 18:28 ` Thierry Reding
2013-09-26 10:57 ` Linus Walleij
2013-09-26 10:57 ` Linus Walleij
2013-09-16 8:32 ` [PATCH 3/9] irqdomain: Introduce __irq_create_of_mapping() Thierry Reding
[not found] ` <1379320326-13241-4-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-16 21:17 ` Rob Herring
2013-09-16 21:17 ` Rob Herring
[not found] ` <52377568.6010204-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-17 8:21 ` Thierry Reding
2013-09-17 8:21 ` Thierry Reding
2013-09-23 19:15 ` Linus Walleij
2013-09-23 19:15 ` Linus Walleij
2013-09-16 8:32 ` [PATCH 4/9] of/irq: Introduce of_irq_get() Thierry Reding
[not found] ` <1379320326-13241-5-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-16 21:24 ` Rob Herring
2013-09-16 21:24 ` Rob Herring
[not found] ` <5237771F.1060908-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-17 13:28 ` Thierry Reding
2013-09-17 13:28 ` Thierry Reding
2013-09-23 19:18 ` Linus Walleij
2013-09-23 19:18 ` Linus Walleij
[not found] ` <CACRpkdYQxD_GAeym7D=npBfrmn88MRYOFh9i2V0xeByiEiWKGQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-23 20:49 ` Thierry Reding
2013-09-23 20:49 ` Thierry Reding
2013-09-16 8:32 ` [PATCH 5/9] of/irq: Introduce __of_irq_to_resource() Thierry Reding
[not found] ` <1379320326-13241-6-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-16 21:29 ` Rob Herring
2013-09-16 21:29 ` Rob Herring
2013-09-23 19:20 ` Linus Walleij
[not found] ` <CACRpkdadFct8iXSaRRQ3a2YQryfMjJwVaq+8wgWXS1Ymj3M_WA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-09-23 20:50 ` Thierry Reding
2013-09-23 20:50 ` Thierry Reding
2013-09-16 8:32 ` [PATCH 6/9] of/irq: Propagate errors in of_irq_to_resource_table() Thierry Reding
2013-09-16 8:32 ` [PATCH 7/9] of/platform: Resolve interrupt references at probe time Thierry Reding
[not found] ` <1379320326-13241-8-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-17 13:04 ` Strashko, Grygorii
2013-09-17 13:04 ` Strashko, Grygorii
2013-09-18 10:43 ` Thierry Reding [this message]
2013-09-16 8:32 ` [PATCH 8/9] of/i2c: " Thierry Reding
[not found] ` <1379320326-13241-9-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-23 7:34 ` Wolfram Sang
2013-09-23 7:34 ` Wolfram Sang
2013-09-23 8:02 ` Thierry Reding
2013-09-23 8:02 ` Thierry Reding
2013-09-23 8:35 ` Wolfram Sang
2013-09-16 8:32 ` [PATCH 9/9] gpio: tegra: Use module_platform_driver() Thierry Reding
[not found] ` <1379320326-13241-10-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-23 19:25 ` Linus Walleij
2013-09-23 19:25 ` Linus Walleij
2013-09-23 20:38 ` Thierry Reding
2013-09-17 11:20 ` [PATCH 0/9] of/irq: Defer interrupt reference resolution Alexandre Belloni
[not found] ` <52383B07.5030806-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
2013-09-17 12:43 ` Thierry Reding
2013-09-17 12:43 ` Thierry Reding
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=20130918104335.GA8256@ulmo \
--to=thierry.reding@gmail.com \
--cc=benh@kernel.crashing.org \
--cc=devicetree@vger.kernel.org \
--cc=grant.likely@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=grygorii.strashko@ti.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=rob.herring@calxeda.com \
--cc=swarren@wwwdotorg.org \
--cc=tglx@linutronix.de \
--cc=wsa@the-dreams.de \
/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.