On 2022/01/06 3:17, Lad Prabhakar 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(). > > Note the code does not set the IRQ flags as this is handled automatically > for DT. > > Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@xxxxxxxxxxxxxx> > --- > Hi All, > > This patch is part of series [1]. I'll re-visit merging of pata_of_platform > into pata_platform at later point. As my primary focus is removal of static > setup of IRQ resource from DT core code. > > [1] https://patchwork.ozlabs.org/project/linux-ide/list/?series=278349 > > v4->v5 > * Set end member of IRQ resource > * Clear irq_res un-conditionally. > > Cheers, > Prabhakar > --- > drivers/ata/pata_of_platform.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/ata/pata_of_platform.c b/drivers/ata/pata_of_platform.c > index 35aa158fc976..c3a40b717dcd 100644 > --- a/drivers/ata/pata_of_platform.c > +++ b/drivers/ata/pata_of_platform.c > @@ -25,11 +25,12 @@ static int pata_of_platform_probe(struct platform_device *ofdev) > struct device_node *dn = ofdev->dev.of_node; > struct resource io_res; > struct resource ctl_res; > - struct resource *irq_res; > + struct resource irq_res; > unsigned int reg_shift = 0; > int pio_mode = 0; > int pio_mask; > bool use16bit; > + int irq; > > ret = of_address_to_resource(dn, 0, &io_res); > if (ret) { > @@ -45,7 +46,15 @@ static int pata_of_platform_probe(struct platform_device *ofdev) > return -EINVAL; > } > > - irq_res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0); > + memset(&irq_res, 0, sizeof(irq_res)); > + > + irq = platform_get_irq_optional(ofdev, 0); > + if (irq < 0 && irq != -ENXIO) > + return irq; > + if (irq > 0) { > + irq_res.start = irq; > + irq_res.end = irq; > + } > > of_property_read_u32(dn, "reg-shift", ®_shift); > > @@ -63,7 +72,7 @@ static int pata_of_platform_probe(struct platform_device *ofdev) > pio_mask = 1 << pio_mode; > pio_mask |= (1 << pio_mode) - 1; > > - return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, irq_res, > + return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, irq > 0 ? &irq_res : NULL, > reg_shift, pio_mask, &pata_platform_sht, > use16bit); > } Andy, Are you OK with this version ? -- Damien Le Moal Western Digital Research