RE: [PATCH v2 2/3] i2c: sh_mobile: Use platform_get_irq_optional() to get the interrupt
From: Prabhakar Mahadev Lad <prabhakar.mahadev-lad.rj@bp.renesas.com>
Date: 2021-12-25 23:45:38
Also in:
linux-i2c, linux-renesas-soc, lkml
Hi Andy, Thank you for the review.
-----Original Message----- From: Andy Shevchenko <redacted> Sent: 25 December 2021 17:49 To: Prabhakar Mahadev Lad <prabhakar.mahadev-lad.rj@bp.renesas.com> Cc: Florian Fainelli <f.fainelli@gmail.com>; Ray Jui <rjui@broadcom.com>; Scott Branden [off-list ref]; bcm-kernel-feedback-list [off-list ref]; Nicolas Saenz Julienne [off-list ref]; Chris Brandt [off-list ref]; Wolfram Sang [off-list ref]; linux-i2c [off-list ref]; linux-rpi-kernel <linux- rpi-kernel@lists.infradead.org>; linux-arm Mailing List [off-list ref]; Linux- Renesas [off-list ref]; Linux Kernel Mailing List [off-list ref]; Prabhakarprabhakar.csengg@gmail.com Subject: Re: [PATCH v2 2/3] i2c: sh_mobile: Use platform_get_irq_optional() to get the interrupt On Wed, Dec 22, 2021 at 2:41 PM Lad Prabhakar [off-list ref] wrote:quoted
platform_get_resource(pdev, IORESOURCE_IRQ, ..) relies on static allocation of IRQ resources in DT core code, this causes an issue when using hierarchical interrupt domains using "interrupts" property in the node as this bypasses the hierarchical setup and messes up the irq chaining. In preparation for removal of static setup of IRQ resource from DT core code use platform_get_irq_optional() for DT users only....quoted
+ if (np) {Same comments as per your other patches, i.e. Why is this check here?
Because the interrupt resource has range of interrupts in one IRQ resource [0]. Let me know if there is any other alternative way to avoid such case.
quoted
+ int irq; + + while ((irq = platform_get_irq_optional(dev, k)) != + -ENXIO) {Consider 0 as no IRQ.
OK. [0] https://elixir.bootlin.com/linux/v5.16-rc6/source/arch/sh/kernel/cpu/sh4a/setup-sh7724.c#L454 Cheers, Prabhakar
quoted
+ if (irq < 0) + return irq; + ret = devm_request_irq(&dev->dev, irq, sh_mobile_i2c_isr, + 0, dev_name(&dev->dev), + pd); if (ret) { - dev_err(&dev->dev, "cannot request IRQ %pa\n", &n); + dev_err(&dev->dev, "cannot request IRQ + %d\n", irq); return ret; } + k++; + }; + } else { + struct resource *res; + resource_size_t n; + + while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) { + for (n = res->start; n <= res->end; n++) { + ret = devm_request_irq(&dev->dev, n, sh_mobile_i2c_isr, + 0, dev_name(&dev->dev), pd); + if (ret) { + dev_err(&dev->dev, "cannot request IRQ %pa\n", &n); + return ret; + } + } + k++; } - k++; }-- With Best Regards, Andy Shevchenko
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel