From: Marc Zyngier <maz@kernel.org>
To: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
Cc: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>,
Geert Uytterhoeven <geert+renesas@glider.be>,
Thomas Gleixner <tglx@linutronix.de>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <brgl@bgdev.pl>,
Thierry Reding <thierry.reding@gmail.com>,
Jonathan Hunter <jonathanh@nvidia.com>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
Andy Gross <agross@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
Andy Shevchenko <andy.shevchenko@gmail.com>,
"open list:GPIO SUBSYSTEM" <linux-gpio@vger.kernel.org>,
linux-tegra <linux-tegra@vger.kernel.org>,
linux-arm-msm <linux-arm-msm@vger.kernel.org>,
"open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS"
<devicetree@vger.kernel.org>, LKML <linux-kernel@vger.kernel.org>,
Linux-Renesas <linux-renesas-soc@vger.kernel.org>,
Phil Edworthy <phil.edworthy@renesas.com>,
Biju Das <biju.das.jz@bp.renesas.com>
Subject: Re: [PATCH v5 2/5] irqchip: Add RZ/G2L IA55 Interrupt Controller driver
Date: Sat, 25 Jun 2022 13:08:30 +0100 [thread overview]
Message-ID: <87fsjt2bep.wl-maz@kernel.org> (raw)
In-Reply-To: <CA+V-a8veE6-4C+9kyTNxqsf0jB5xCGhcHncTSM3ejDzBAfz=Bw@mail.gmail.com>
On Sat, 25 Jun 2022 11:54:44 +0100,
"Lad, Prabhakar" <prabhakar.csengg@gmail.com> wrote:
>
> Hi Marc,
>
> Thank you for the review.
>
> On Sat, Jun 25, 2022 at 10:30 AM Marc Zyngier <maz@kernel.org> wrote:
> >
> > On Mon, 23 May 2022 18:42:35 +0100,
> > Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> wrote:
> > >
[...]
> > > +static int rzg2l_irqc_alloc(struct irq_domain *domain, unsigned int virq,
> > > + unsigned int nr_irqs, void *arg)
> > > +{
> > > + struct rzg2l_irqc_priv *priv = domain->host_data;
> > > + unsigned long *chip_data = NULL;
> >
> > Why the init to NULL?
> >
> Can be dropped.
>
> > > + struct irq_fwspec spec;
> > > + irq_hw_number_t hwirq;
> > > + int tint = -EINVAL;
> > > + unsigned int type;
> > > + unsigned int i;
> > > + int ret;
> > > +
> > > + ret = irq_domain_translate_twocell(domain, arg, &hwirq, &type);
> > > + if (ret)
> > > + return ret;
> > > +
> > > + /*
> > > + * For TINT interrupts ie where pinctrl driver is child of irqc domain
> > > + * the hwirq and TINT are encoded in fwspec->param[0].
> > > + * hwirq for TINT range from 9-40, hwirq is embedded 0-15 bits and TINT
> > > + * from 16-31 bits. TINT from the pinctrl driver needs to be programmed
> > > + * in IRQC registers to enable a given gpio pin as interrupt.
> > > + */
> > > + if (hwirq > IRQC_IRQ_COUNT) {
> > > + tint = TINT_EXTRACT_GPIOINT(hwirq);
> > > + hwirq = TINT_EXTRACT_HWIRQ(hwirq);
> > > +
> > > + if (hwirq < IRQC_TINT_START)
> > > + return -EINVAL;
> > > + }
> > > +
> > > + if (hwirq > (IRQC_NUM_IRQ - 1))
> > > + return -EINVAL;
> > > +
> > > + chip_data = kzalloc(sizeof(*chip_data), GFP_KERNEL);
> >
> > Are we really allocating an unsigned long for something that already
> > fits in something that is pointer-sized?
> >
> I think I received some feedback to use unsigned long. Let me know
> what you want me to use here.
I think this is just a waste of memory, but I don't really care.
>
> > > + if (!chip_data)
> > > + return -ENOMEM;
> > > + *chip_data = tint;
> >
> > So here, *chip_data can be set to -EINVAL if hwirq <= IRQC_IRQ_COUNT?
> > This can't be right.
> >
> Yes *chip_data can be -EINVAL. IRQC block handles IRQ0-7 and
> GPIOINT0-122. So the -EINVAL here is for IRQ0-7 case were dont
> required the chip data in the call backs hence -EINVAL, Whereas for
> GPIOINT0-122 we need chip_data in the callbacks as this value needs to
> be programmed in the hardware registers.
I can't see anything that checks it (let alone the difference in
types). And if it isn't checked, this means that the allocation is
pointless.
>
> > > +
> > > + ret = irq_domain_set_hwirq_and_chip(domain, virq, hwirq, &irqc_chip,
> > > + chip_data);
> > > + if (ret) {
> > > + kfree(chip_data);
> > > + return ret;
> > > + }
> > > +
> > > + spec.fwnode = domain->parent->fwnode;
> > > + spec.param_count = priv->map[hwirq].args_count;
> > > + for (i = 0; i < spec.param_count; i++)
> > > + spec.param[i] = priv->map[hwirq].args[i];
> >
> > Why isn't that simply:
> >
> > spec = priv->map[hwirq];
> >
> spec is of type ‘struct irq_fwspec’ and map is of type ‘struct of_phandle_args’.
>
> > as this really is the interrupt you want to map to?
> >
> Yes.
>
> > > +
> > > + ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &spec);
> >
> > or even better:
> >
> > ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs,
> > &priv->map[hwirq]);
> >
> Does not work as map is of type ‘struct of_phandle_args’.
Which begs the question: why don't you convert it to an irq_fwspec the
first place and be done with it?
>
> > > + if (ret)
> > > + kfree(chip_data);
> > > +
> > > + return ret;
> > > +}
> > > +
> > > +static void rzg2l_irqc_domain_free(struct irq_domain *domain, unsigned int virq,
> > > + unsigned int nr_irqs)
> > > +{
> > > + struct irq_data *d;
> > > +
> > > + d = irq_domain_get_irq_data(domain, virq);
> > > + if (d)
> > > + kfree(d->chip_data);
> > > +
> > > + irq_domain_free_irqs_common(domain, virq, nr_irqs);
> > > +}
> > > +
> > > +static const struct irq_domain_ops rzg2l_irqc_domain_ops = {
> > > + .alloc = rzg2l_irqc_alloc,
> > > + .free = rzg2l_irqc_domain_free,
> > > + .translate = irq_domain_translate_twocell,
> > > +};
> > > +
> > > +static int rzg2l_irqc_parse_map(struct rzg2l_irqc_priv *priv,
> > > + struct device_node *np)
nit: this function could afford being renamed to something more
correct. It really doesn't map anything, only retrieves the output
interrupts.
> > > +{
> > > + unsigned int i;
> > > + int ret;
> > > +
> > > + for (i = 0; i < IRQC_NUM_IRQ; i++) {
> > > + ret = of_irq_parse_one(np, i, &priv->map[i]);
Make map an array of irq_fwspec, and use of_phandle_args_to_fwspec()
for the conversion.
> > > + if (ret)
> > > + return ret;
> > > + }
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static int rzg2l_irqc_init(struct device_node *node, struct device_node *parent)
> > > +{
> > > + struct irq_domain *irq_domain, *parent_domain;
> > > + struct platform_device *pdev;
> > > + struct reset_control *resetn;
> > > + struct rzg2l_irqc_priv *priv;
> > > + int ret;
> > > +
> > > + pdev = of_find_device_by_node(node);
> > > + if (!pdev)
> > > + return -ENODEV;
> > > +
> > > + parent_domain = irq_find_host(parent);
> > > + if (!parent_domain) {
> > > + dev_err(&pdev->dev, "cannot find parent domain\n");
> > > + return -ENODEV;
> > > + }
> > > +
> > > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
> > > + if (!priv)
> > > + return -ENOMEM;
> > > +
> > > + priv->base = devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NULL);
> > > + if (IS_ERR(priv->base))
> > > + return PTR_ERR(priv->base);
> > > +
> > > + ret = rzg2l_irqc_parse_map(priv, node);
> > > + if (ret) {
> > > + dev_err(&pdev->dev, "cannot parse interrupts: %d\n", ret);
> > > + return ret;
> > > + }
> > > +
> > > + resetn = devm_reset_control_get_exclusive_by_index(&pdev->dev, 0);
> > > + if (IS_ERR(resetn))
> > > + return IS_ERR(resetn);
> > > +
> > > + ret = reset_control_deassert(resetn);
> > > + if (ret) {
> > > + dev_err(&pdev->dev, "failed to deassert resetn pin, %d\n", ret);
> > > + return ret;
> > > + }
> > > +
> > > + pm_runtime_enable(&pdev->dev);
> > > + ret = pm_runtime_resume_and_get(&pdev->dev);
> > > + if (ret < 0) {
> > > + dev_err(&pdev->dev, "pm_runtime_resume_and_get failed: %d\n", ret);
> > > + goto pm_disable;
> > > + }
> >
> > If using runtime PM, why isn't the core IRQ code made aware of this
> > dependency by registering the device with irq_domain_set_pm_device()
> > instead of leaving it enabled forever?
> >
> Ouch will add irq_domain_set_pm_device() below.
You'll need a bit more than that. You'll either need to take a PM
reference on each alloc, or improve irq_chip_pm_{get,put}() to talk
the hierarchy.
That's probably a separate patch.
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2022-06-25 12:08 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-23 17:42 [PATCH v5 0/5] Renesas RZ/G2L IRQC support Lad Prabhakar
2022-05-23 17:42 ` [PATCH v5 1/5] dt-bindings: interrupt-controller: Add Renesas RZ/G2L Interrupt Controller Lad Prabhakar
2022-05-23 17:42 ` [PATCH v5 2/5] irqchip: Add RZ/G2L IA55 Interrupt Controller driver Lad Prabhakar
2022-06-25 9:30 ` Marc Zyngier
2022-06-25 10:54 ` Lad, Prabhakar
2022-06-25 12:08 ` Marc Zyngier [this message]
2022-06-25 12:48 ` Lad, Prabhakar
2022-06-25 16:09 ` Marc Zyngier
2022-06-25 19:26 ` Lad, Prabhakar
2022-05-23 17:42 ` [PATCH v5 3/5] gpio: gpiolib: Allow free() callback to be overridden Lad Prabhakar
2022-05-24 8:54 ` Linus Walleij
2022-05-24 9:06 ` Lad, Prabhakar
2022-05-24 9:29 ` Linus Walleij
2022-05-23 17:42 ` [PATCH v5 4/5] dt-bindings: pinctrl: renesas,rzg2l-pinctrl: Document the properties to handle GPIO IRQ Lad Prabhakar
2022-06-02 13:36 ` Rob Herring
2022-05-23 17:42 ` [PATCH v5 5/5] pinctrl: renesas: pinctrl-rzg2l: Add IRQ domain to handle GPIO interrupt Lad Prabhakar
2022-05-24 8:57 ` Linus Walleij
2022-05-24 9:01 ` Lad, Prabhakar
2022-05-24 9:26 ` Linus Walleij
[not found] ` <CA+V-a8uu5sTOWrWZVY=YaUaOfQZFHx46snHTRnW7ddJyH-obvA@mail.gmail.com>
2022-05-24 11:58 ` Linus Walleij
2022-06-19 19:29 ` [PATCH v5 0/5] Renesas RZ/G2L IRQC support Lad, Prabhakar
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=87fsjt2bep.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=agross@kernel.org \
--cc=andy.shevchenko@gmail.com \
--cc=biju.das.jz@bp.renesas.com \
--cc=bjorn.andersson@linaro.org \
--cc=brgl@bgdev.pl \
--cc=devicetree@vger.kernel.org \
--cc=geert+renesas@glider.be \
--cc=jonathanh@nvidia.com \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=phil.edworthy@renesas.com \
--cc=prabhakar.csengg@gmail.com \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
--cc=robh+dt@kernel.org \
--cc=tglx@linutronix.de \
--cc=thierry.reding@gmail.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.