diff mbox series

[v4] thermal: rcar_thermal: Use platform_get_irq_optional() to get the interrupt

Message ID 20220110144039.5810-1-prabhakar.mahadev-lad.rj@bp.renesas.com (mailing list archive)
State New, archived
Delegated to: Daniel Lezcano
Headers show
Series [v4] thermal: rcar_thermal: Use platform_get_irq_optional() to get the interrupt | expand

Commit Message

Prabhakar Jan. 10, 2022, 2:40 p.m. UTC
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().

Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
v3->v4:
* Updated check as suggested by Andy

v2->v3:
* Fixed review comment pointed by Andy

v1->v2
* Simplified checking error code
* Break loop earlier if no interrupts are seen

v1: https://lkml.org/lkml/2021/12/18/163
---
 drivers/thermal/rcar_thermal.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

Comments

Geert Uytterhoeven Jan. 12, 2022, 8:35 a.m. UTC | #1
On Tue, Jan 11, 2022 at 4:24 AM Lad Prabhakar
<prabhakar.mahadev-lad.rj@bp.renesas.com> wrote:
> 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().
>
> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
Lad, Prabhakar March 9, 2022, 11:59 a.m. UTC | #2
Hi Niklas,

On Mon, Jan 10, 2022 at 2:40 PM Lad Prabhakar
<prabhakar.mahadev-lad.rj@bp.renesas.com> wrote:
>
> 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().
>
> Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
> ---
> v3->v4:
> * Updated check as suggested by Andy
>
> v2->v3:
> * Fixed review comment pointed by Andy
>
> v1->v2
> * Simplified checking error code
> * Break loop earlier if no interrupts are seen
>
> v1: https://lkml.org/lkml/2021/12/18/163
> ---
>  drivers/thermal/rcar_thermal.c | 17 ++++++++++++-----
>  1 file changed, 12 insertions(+), 5 deletions(-)
>
This patch is not in -next yet. In which release v5.18/19 do you plan
to merge this in?

Cheers,
Prabhakar

> diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c
> index b49f04daaf47..1d729ed4d685 100644
> --- a/drivers/thermal/rcar_thermal.c
> +++ b/drivers/thermal/rcar_thermal.c
> @@ -445,7 +445,7 @@ static int rcar_thermal_probe(struct platform_device *pdev)
>         struct rcar_thermal_common *common;
>         struct rcar_thermal_priv *priv;
>         struct device *dev = &pdev->dev;
> -       struct resource *res, *irq;
> +       struct resource *res;
>         const struct rcar_thermal_chip *chip = of_device_get_match_data(dev);
>         int mres = 0;
>         int i;
> @@ -467,9 +467,16 @@ static int rcar_thermal_probe(struct platform_device *pdev)
>         pm_runtime_get_sync(dev);
>
>         for (i = 0; i < chip->nirqs; i++) {
> -               irq = platform_get_resource(pdev, IORESOURCE_IRQ, i);
> -               if (!irq)
> -                       continue;
> +               int irq;
> +
> +               ret = platform_get_irq_optional(pdev, i);
> +               if (ret < 0 && ret != -ENXIO)
> +                       goto error_unregister;
> +               if (ret > 0)
> +                       irq = ret;
> +               else
> +                       break;
> +
>                 if (!common->base) {
>                         /*
>                          * platform has IRQ support.
> @@ -487,7 +494,7 @@ static int rcar_thermal_probe(struct platform_device *pdev)
>                         idle = 0; /* polling delay is not needed */
>                 }
>
> -               ret = devm_request_irq(dev, irq->start, rcar_thermal_irq,
> +               ret = devm_request_irq(dev, irq, rcar_thermal_irq,
>                                        IRQF_SHARED, dev_name(dev), common);
>                 if (ret) {
>                         dev_err(dev, "irq request failed\n ");
> --
> 2.17.1
>
Daniel Lezcano March 9, 2022, 12:40 p.m. UTC | #3
On 09/03/2022 12:59, Lad, Prabhakar wrote:

[ ... ]

>> ---
>>   drivers/thermal/rcar_thermal.c | 17 ++++++++++++-----
>>   1 file changed, 12 insertions(+), 5 deletions(-)
>>
> This patch is not in -next yet. In which release v5.18/19 do you plan
> to merge this in?
Right, I missed it, I'll try to catch it up for v5.18-rc1, may be with a 
second PR.

It is in the linux-next branch now and will land in linux-next tree
Lad, Prabhakar March 9, 2022, 12:47 p.m. UTC | #4
On Wed, Mar 9, 2022 at 12:40 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
>
> On 09/03/2022 12:59, Lad, Prabhakar wrote:
>
> [ ... ]
>
> >> ---
> >>   drivers/thermal/rcar_thermal.c | 17 ++++++++++++-----
> >>   1 file changed, 12 insertions(+), 5 deletions(-)
> >>
> > This patch is not in -next yet. In which release v5.18/19 do you plan
> > to merge this in?
> Right, I missed it, I'll try to catch it up for v5.18-rc1, may be with a
> second PR.
>
should be OK.

> It is in the linux-next branch now and will land in linux-next tree
>
Thanks.

Cheers,
Prabhakar
diff mbox series

Patch

diff --git a/drivers/thermal/rcar_thermal.c b/drivers/thermal/rcar_thermal.c
index b49f04daaf47..1d729ed4d685 100644
--- a/drivers/thermal/rcar_thermal.c
+++ b/drivers/thermal/rcar_thermal.c
@@ -445,7 +445,7 @@  static int rcar_thermal_probe(struct platform_device *pdev)
 	struct rcar_thermal_common *common;
 	struct rcar_thermal_priv *priv;
 	struct device *dev = &pdev->dev;
-	struct resource *res, *irq;
+	struct resource *res;
 	const struct rcar_thermal_chip *chip = of_device_get_match_data(dev);
 	int mres = 0;
 	int i;
@@ -467,9 +467,16 @@  static int rcar_thermal_probe(struct platform_device *pdev)
 	pm_runtime_get_sync(dev);
 
 	for (i = 0; i < chip->nirqs; i++) {
-		irq = platform_get_resource(pdev, IORESOURCE_IRQ, i);
-		if (!irq)
-			continue;
+		int irq;
+
+		ret = platform_get_irq_optional(pdev, i);
+		if (ret < 0 && ret != -ENXIO)
+			goto error_unregister;
+		if (ret > 0)
+			irq = ret;
+		else
+			break;
+
 		if (!common->base) {
 			/*
 			 * platform has IRQ support.
@@ -487,7 +494,7 @@  static int rcar_thermal_probe(struct platform_device *pdev)
 			idle = 0; /* polling delay is not needed */
 		}
 
-		ret = devm_request_irq(dev, irq->start, rcar_thermal_irq,
+		ret = devm_request_irq(dev, irq, rcar_thermal_irq,
 				       IRQF_SHARED, dev_name(dev), common);
 		if (ret) {
 			dev_err(dev, "irq request failed\n ");