From: Thomas Gleixner <tglx@linutronix.de>
To: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Geert Uytterhoeven <geert+renesas@glider.be>,
Magnus Damm <magnus.damm@gmail.com>,
Cosmin Tanislav <cosmin-gabriel.tanislav.xa@renesas.com>
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH 2/4] irqchip: add RZ/{T2H,N2H} Interrupt Controller (ICU) driver
Date: Sat, 22 Nov 2025 16:55:36 +0100 [thread overview]
Message-ID: <87see6hxjb.ffs@tglx> (raw)
In-Reply-To: <20251121111423.1379395-3-cosmin-gabriel.tanislav.xa@renesas.com>
On Fri, Nov 21 2025 at 13:14, Cosmin Tanislav wrote:
> +static inline int rzt2h_icu_irq_to_offset(struct irq_data *d, void __iomem **base,
> + unsigned int *offset)
> +{
> + struct rzt2h_icu_priv *priv = irq_data_to_priv(d);
> + unsigned int hwirq = irqd_to_hwirq(d);
> +
> + if (RZT2H_ICU_IRQ_IN_RANGE(hwirq, IRQ_NS)) {
> + *offset = hwirq - RZT2H_ICU_IRQ_NS_START;
> + *base = priv->base_ns;
> + } else if (RZT2H_ICU_IRQ_IN_RANGE(hwirq, IRQ_S) ||
> + /* SEI follows safety IRQs in registers and in IRQ numbers. */
> + RZT2H_ICU_IRQ_IN_RANGE(hwirq, SEI)) {
This nested commend in the condition is really unreadable.
> + *offset = hwirq - RZT2H_ICU_IRQ_S_START;
> + *base = priv->base_s;
> + } else {
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static int rzt2h_icu_irq_set_type(struct irq_data *d, unsigned int type)
> +{
> + struct rzt2h_icu_priv *priv = irq_data_to_priv(d);
> + unsigned int parent_type;
> + unsigned int offset;
Combine same data types into one line please.
> + void __iomem *base;
> + u32 val, md;
> + int ret;
> + guard(raw_spinlock)(&priv->lock);
> + val = readl_relaxed(base + RZT2H_ICU_PORTNF_MD);
> + val &= ~RZT2H_ICU_PORTNF_MDi_MASK(offset);
> + val |= RZT2H_ICU_PORTNF_MDi_PREP(offset, md);
> + writel_relaxed(val, base + RZT2H_ICU_PORTNF_MD);
> +
This looks wrong. guard() holds the lock across the set_parent()
call. If you really need that then this needs a comment explaining the
why. Otherwise use scoped_guard().
> + return irq_chip_set_type_parent(d, parent_type);
> +}
> +static const struct irq_chip rzt2h_icu_chip = {
> + .name = "rzt2h-icu",
> + .irq_mask = irq_chip_mask_parent,
> + .irq_unmask = irq_chip_unmask_parent,
> + .irq_eoi = irq_chip_eoi_parent,
> + .irq_set_type = rzt2h_icu_set_type,
> + .irq_set_wake = irq_chip_set_wake_parent,
> + .irq_set_affinity = irq_chip_set_affinity_parent,
> + .irq_retrigger = irq_chip_retrigger_hierarchy,
> + .irq_get_irqchip_state = irq_chip_get_parent_state,
> + .irq_set_irqchip_state = irq_chip_set_parent_state,
> + .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SET_TYPE_MASKED |
> + IRQCHIP_SKIP_SET_WAKE,
https://www.kernel.org/doc/html/latest/process/maintainer-tip.html#struct-declarations-and-initializers
And please read and follow the rest of the documentation too.
> +};
> +
> +static int rzt2h_icu_alloc(struct irq_domain *domain, unsigned int virq,
> + unsigned int nr_irqs, void *arg)
> +{
> + struct rzt2h_icu_priv *priv = domain->host_data;
> + irq_hw_number_t hwirq;
> + unsigned int type;
> + int ret;
> +
> + ret = irq_domain_translate_twocell(domain, arg, &hwirq, &type);
> + if (ret)
> + return ret;
> +
> + ret = irq_domain_set_hwirq_and_chip(domain, virq, hwirq, &rzt2h_icu_chip,
> + NULL);
Get rid of the line breaks all over the place. You have 100 characters.
> + if (ret)
> + return ret;
> +
> + return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs,
> + &priv->fwspec[hwirq]);
> +}
> +static int rzt2h_icu_init(struct platform_device *pdev,
> + struct device_node *parent)
> +{
> + struct irq_domain *irq_domain, *parent_domain;
> + struct device_node *node = pdev->dev.of_node;
> + struct device *dev = &pdev->dev;
> + struct rzt2h_icu_priv *priv;
> + int ret;
> +
> + parent_domain = irq_find_host(parent);
> + if (!parent_domain)
> + return dev_err_probe(dev, -ENODEV, "cannot find parent domain\n");
> +
> + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + platform_set_drvdata(pdev, priv);
> +
> + priv->base_ns = devm_of_iomap(dev, dev->of_node, 0, NULL);
> + if (IS_ERR(priv->base_ns))
> + return PTR_ERR(priv->base_ns);
> +
> + priv->base_s = devm_of_iomap(dev, dev->of_node, 1, NULL);
> + if (IS_ERR(priv->base_s))
> + return PTR_ERR(priv->base_s);
> +
> + ret = rzt2h_icu_parse_interrupts(priv, node);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "cannot parse interrupts: %d\n", ret);
> +
> + ret = devm_pm_runtime_enable(dev);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "devm_pm_runtime_enable failed: %d\n", ret);
> +
> + ret = pm_runtime_resume_and_get(dev);
> + if (ret)
> + return dev_err_probe(dev, ret,
> + "pm_runtime_resume_and_get failed: %d\n", ret);
> +
> + raw_spin_lock_init(&priv->lock);
> +
> + irq_domain = irq_domain_create_hierarchy(parent_domain, 0, RZT2H_ICU_NUM_IRQ,
> + dev_fwnode(dev),
> + &rzt2h_icu_domain_ops, priv);
> + if (!irq_domain) {
> + pm_runtime_put(dev);
> + return -ENOMEM;
> + }
The mix of 'return $ERR' and 'return dev_err_probe()' is confusing at best.
Thanks,
tglx
next prev parent reply other threads:[~2025-11-22 15:55 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-21 11:14 [PATCH 0/4] Add ICU support for RZ/T2H and RZ/N2H Cosmin Tanislav
2025-11-21 11:14 ` [PATCH 1/4] dt-bindings: interrupt-controller: document RZ/{T2H,N2H} ICU Cosmin Tanislav
2025-11-23 13:23 ` Krzysztof Kozlowski
2025-11-24 16:25 ` Cosmin-Gabriel Tanislav
2025-11-27 7:19 ` Krzysztof Kozlowski
2025-11-27 14:44 ` Cosmin-Gabriel Tanislav
2025-11-21 11:14 ` [PATCH 2/4] irqchip: add RZ/{T2H,N2H} Interrupt Controller (ICU) driver Cosmin Tanislav
2025-11-22 15:55 ` Thomas Gleixner [this message]
2025-11-24 12:50 ` Cosmin-Gabriel Tanislav
2025-11-24 13:49 ` Thomas Gleixner
2025-11-24 15:28 ` Cosmin-Gabriel Tanislav
2025-11-24 19:01 ` Thomas Gleixner
2025-11-21 11:14 ` [PATCH 3/4] arm64: dts: renesas: r9a09g077: add ICU support Cosmin Tanislav
2025-11-21 11:14 ` [PATCH 4/4] arm64: dts: renesas: r9a09g087: " Cosmin Tanislav
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=87see6hxjb.ffs@tglx \
--to=tglx@linutronix.de \
--cc=conor+dt@kernel.org \
--cc=cosmin-gabriel.tanislav.xa@renesas.com \
--cc=devicetree@vger.kernel.org \
--cc=geert+renesas@glider.be \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=robh@kernel.org \
/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.