Add a pnp_add_irq_resource() that can be used by all the PNP backends. This consolidates a little more pnp_resource_table knowledge into one place. Signed-off-by: Bjorn Helgaas --- drivers/pnp/base.h | 3 +++ drivers/pnp/resource.c | 24 ++++++++++++++++++++++++ drivers/pnp/interface.c | 14 ++++++-------- drivers/pnp/isapnp/core.c | 8 +++----- drivers/pnp/pnpacpi/rsparser.c | 31 +++++++------------------------ drivers/pnp/pnpbios/rsparser.c | 31 +++++++------------------------ 6 files changed, 50 insertions(+), 61 deletions(-) Index: work8/drivers/pnp/base.h =================================================================== --- work8.orig/drivers/pnp/base.h 2008-04-17 15:05:12.000000000 -0600 +++ work8/drivers/pnp/base.h 2008-04-18 11:00:36.000000000 -0600 @@ -35,3 +35,6 @@ struct pnp_resource dma[PNP_MAX_DMA]; struct pnp_resource irq[PNP_MAX_IRQ]; }; + +struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq, + int flags); Index: work8/drivers/pnp/resource.c =================================================================== --- work8.orig/drivers/pnp/resource.c 2008-04-17 15:05:13.000000000 -0600 +++ work8/drivers/pnp/resource.c 2008-04-18 11:00:36.000000000 -0600 @@ -559,6 +559,30 @@ return NULL; } +struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq, + int flags) +{ + struct pnp_resource *pnp_res; + struct resource *res; + static unsigned char warned; + + pnp_res = pnp_new_resource(dev, IORESOURCE_IRQ); + if (!pnp_res) { + if (!warned) { + dev_err(&dev->dev, "can't add resource for IRQ %d\n", + irq); + warned = 1; + } + return NULL; + } + + res = &pnp_res->res; + res->flags = IORESOURCE_IRQ | flags; + res->start = irq; + res->end = irq; + return pnp_res; +} + /* format is: pnp_reserve_irq=irq1[,irq2] .... */ static int __init pnp_setup_reserve_irq(char *str) { Index: work8/drivers/pnp/interface.c =================================================================== --- work8.orig/drivers/pnp/interface.c 2008-04-17 14:56:51.000000000 -0600 +++ work8/drivers/pnp/interface.c 2008-04-18 11:02:06.000000000 -0600 @@ -322,9 +322,11 @@ const char *ubuf, size_t count) { struct pnp_dev *dev = to_pnp_dev(dmdev); + struct pnp_resource *pnp_res; struct resource *res; char *buf = (void *)ubuf; int retval = 0; + resource_size_t start; if (dev->status & PNP_ATTACHED) { retval = -EBUSY; @@ -426,14 +428,10 @@ buf += 3; while (isspace(*buf)) ++buf; - res = pnp_get_resource(dev, IORESOURCE_IRQ, - nirq); - if (!res) - break; - res->start = res->end = - simple_strtoul(buf, &buf, 0); - res->flags = IORESOURCE_IRQ; - nirq++; + start = simple_strtoul(buf, &buf, 0); + pnp_res = pnp_add_irq_resource(dev, start, 0); + if (pnp_res) + pnp_res->index = nirq++; continue; } if (!strnicmp(buf, "dma", 3)) { Index: work8/drivers/pnp/isapnp/core.c =================================================================== --- work8.orig/drivers/pnp/isapnp/core.c 2008-04-17 15:05:12.000000000 -0600 +++ work8/drivers/pnp/isapnp/core.c 2008-04-18 11:00:36.000000000 -0600 @@ -956,11 +956,9 @@ 8); if (!ret) continue; - pnp_res = &dev->res->irq[tmp]; - pnp_res->index = tmp; - res = &pnp_res->res; - res->start = res->end = ret; - res->flags = IORESOURCE_IRQ; + pnp_res = pnp_add_irq_resource(dev, ret, 0); + if (pnp_res) + pnp_res->index = tmp; } for (tmp = 0; tmp < ISAPNP_MAX_DMA; tmp++) { ret = isapnp_read_byte(ISAPNP_CFG_DMA + tmp); Index: work8/drivers/pnp/pnpacpi/rsparser.c =================================================================== --- work8.orig/drivers/pnp/pnpacpi/rsparser.c 2008-04-17 15:04:41.000000000 -0600 +++ work8/drivers/pnp/pnpacpi/rsparser.c 2008-04-18 11:00:36.000000000 -0600 @@ -82,26 +82,12 @@ u32 gsi, int triggering, int polarity, int shareable) { - struct resource *res; - int i; - int irq; + int irq, flags; int p, t; - static unsigned char warned; if (!valid_IRQ(gsi)) return; - for (i = 0; i < PNP_MAX_IRQ; i++) { - res = &dev->res->irq[i].res; - if (res->flags & IORESOURCE_UNSET) - break; - } - if (i >= PNP_MAX_IRQ && !warned) { - printk(KERN_WARNING "pnpacpi: exceeded the max number of IRQ " - "resources: %d \n", PNP_MAX_IRQ); - warned = 1; - return; - } /* * in IO-APIC mode, use overrided attribute. Two reasons: * 1. BIOS bug in DSDT @@ -119,17 +105,14 @@ } } - res->flags = IORESOURCE_IRQ; // Also clears _UNSET flag - res->flags |= irq_flags(triggering, polarity, shareable); + flags = irq_flags(triggering, polarity, shareable); irq = acpi_register_gsi(gsi, triggering, polarity); - if (irq < 0) { - res->flags |= IORESOURCE_DISABLED; - return; - } + if (irq >= 0) + pcibios_penalize_isa_irq(irq, 1); + else + flags |= IORESOURCE_DISABLED; - res->start = irq; - res->end = irq; - pcibios_penalize_isa_irq(irq, 1); + pnp_add_irq_resource(dev, irq, flags); } static int dma_flags(int type, int bus_master, int transfer) Index: work8/drivers/pnp/pnpbios/rsparser.c =================================================================== --- work8.orig/drivers/pnp/pnpbios/rsparser.c 2008-04-17 15:04:41.000000000 -0600 +++ work8/drivers/pnp/pnpbios/rsparser.c 2008-04-18 11:00:36.000000000 -0600 @@ -54,28 +54,6 @@ * Allocated Resources */ -static void pnpbios_parse_allocated_irqresource(struct pnp_dev *dev, int irq) -{ - struct resource *res; - int i; - - for (i = 0; i < PNP_MAX_IRQ; i++) { - res = &dev->res->irq[i].res; - if (res->flags & IORESOURCE_UNSET) - break; - } - - if (i < PNP_MAX_IRQ) { - res->flags = IORESOURCE_IRQ; // Also clears _UNSET flag - if (irq == -1) { - res->flags |= IORESOURCE_DISABLED; - return; - } - res->start = res->end = (unsigned long)irq; - pcibios_penalize_isa_irq(irq, 1); - } -} - static void pnpbios_parse_allocated_dmaresource(struct pnp_dev *dev, int dma) { struct resource *res; @@ -148,7 +126,7 @@ unsigned char *end) { unsigned int len, tag; - int io, size, mask, i; + int io, size, mask, i, flags; if (!p) return NULL; @@ -203,12 +181,17 @@ case SMALL_TAG_IRQ: if (len < 2 || len > 3) goto len_err; + flags = 0; io = -1; mask = p[1] + p[2] * 256; for (i = 0; i < 16; i++, mask = mask >> 1) if (mask & 0x01) io = i; - pnpbios_parse_allocated_irqresource(dev, io); + if (io != -1) + pcibios_penalize_isa_irq(io, 1); + else + flags = IORESOURCE_DISABLED; + pnp_add_irq_resource(dev, io, flags); break; case SMALL_TAG_DMA: -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/