static void pnpacpi_add_irqresource(struct pnp_dev *dev, struct resource *r) { if (!(r->flags & IORESOURCE_DISABLED)) pcibios_penalize_isa_irq(r->start, 1); pnp_add_resource(dev, r); }
int pnp_register_irq_resource(struct pnp_option *option, struct pnp_irq *data) { struct pnp_irq *ptr; if (!option) return -EINVAL; if (!data) return -EINVAL; ptr = option->irq; while (ptr && ptr->next) ptr = ptr->next; if (ptr) ptr->next = data; else option->irq = data; #ifdef CONFIG_PCI { int i; for (i=0; i<16; i++) if (data->map & (1<<i)) pcibios_penalize_isa_irq(i); } #endif return 0; }
static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, u32 gsi, int triggering, int polarity, int shareable) { int i = 0; int irq; if (!valid_IRQ(gsi)) return; while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) && i < PNP_MAX_IRQ) i++; if (i >= PNP_MAX_IRQ) return; res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag irq = acpi_register_gsi(gsi, triggering, polarity); if (irq < 0) { res->irq_resource[i].flags |= IORESOURCE_DISABLED; return; } if (shareable) res->irq_resource[i].flags |= IORESOURCE_IRQ_SHAREABLE; res->irq_resource[i].start = irq; res->irq_resource[i].end = irq; pcibios_penalize_isa_irq(irq, 1); }
static void pnpacpi_parse_allocated_irqresource(struct pnp_dev *dev, u32 gsi, int triggering, int polarity, int shareable) { int irq, flags; int p, t; if (!valid_IRQ(gsi)) { pnp_add_irq_resource(dev, gsi, IORESOURCE_DISABLED); return; } if (!acpi_get_override_irq(gsi, &t, &p)) { t = t ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; p = p ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; if (triggering != t || polarity != p) { dev_warn(&dev->dev, "IRQ %d override to %s, %s\n", gsi, t ? "edge":"level", p ? "low":"high"); triggering = t; polarity = p; } } flags = irq_flags(triggering, polarity, shareable); irq = acpi_register_gsi(&dev->dev, gsi, triggering, polarity); if (irq >= 0) pcibios_penalize_isa_irq(irq, 1); else flags |= IORESOURCE_DISABLED; pnp_add_irq_resource(dev, irq, flags); }
static void pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, u32 gsi, int edge_level, int active_high_low) { int i = 0; int irq; if (!valid_IRQ(gsi)) return; while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) && i < PNP_MAX_IRQ) i++; if (i >= PNP_MAX_IRQ) return; res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag irq = acpi_register_gsi(gsi, edge_level, active_high_low); if (irq < 0) { res->irq_resource[i].flags |= IORESOURCE_DISABLED; return; } res->irq_resource[i].start = irq; res->irq_resource[i].end = irq; pcibios_penalize_isa_irq(irq, 1); }
static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, void *data) { struct pnp_resource_table * res_table = (struct pnp_resource_table *)data; switch (res->id) { case ACPI_RSTYPE_IRQ: if ((res->data.irq.number_of_interrupts > 0) && valid_IRQ(res->data.irq.interrupts[0])) { pnpacpi_parse_allocated_irqresource(res_table, acpi_register_gsi(res->data.irq.interrupts[0], res->data.irq.edge_level, res->data.irq.active_high_low)); pcibios_penalize_isa_irq(res->data.irq.interrupts[0]); } break; case ACPI_RSTYPE_EXT_IRQ: if ((res->data.extended_irq.number_of_interrupts > 0) && valid_IRQ(res->data.extended_irq.interrupts[0])) { pnpacpi_parse_allocated_irqresource(res_table, acpi_register_gsi(res->data.extended_irq.interrupts[0], res->data.extended_irq.edge_level, res->data.extended_irq.active_high_low)); pcibios_penalize_isa_irq(res->data.extended_irq.interrupts[0]); } break; case ACPI_RSTYPE_DMA: if (res->data.dma.number_of_channels > 0) pnpacpi_parse_allocated_dmaresource(res_table, res->data.dma.channels[0]); break; case ACPI_RSTYPE_IO: pnpacpi_parse_allocated_ioresource(res_table, res->data.io.min_base_address, res->data.io.range_length); break; case ACPI_RSTYPE_FIXED_IO: pnpacpi_parse_allocated_ioresource(res_table, res->data.fixed_io.base_address, res->data.fixed_io.range_length); break; case ACPI_RSTYPE_MEM24: pnpacpi_parse_allocated_memresource(res_table, res->data.memory24.min_base_address, res->data.memory24.range_length); break; case ACPI_RSTYPE_MEM32: pnpacpi_parse_allocated_memresource(res_table, res->data.memory32.min_base_address, res->data.memory32.range_length); break; case ACPI_RSTYPE_FIXED_MEM32: pnpacpi_parse_allocated_memresource(res_table, res->data.fixed_memory32.range_base_address, res->data.fixed_memory32.range_length); break; case ACPI_RSTYPE_ADDRESS16: pnpacpi_parse_allocated_memresource(res_table, res->data.address16.min_address_range, res->data.address16.address_length); break; case ACPI_RSTYPE_ADDRESS32: pnpacpi_parse_allocated_memresource(res_table, res->data.address32.min_address_range, res->data.address32.address_length); break; case ACPI_RSTYPE_ADDRESS64: pnpacpi_parse_allocated_memresource(res_table, res->data.address64.min_address_range, res->data.address64.address_length); break; default: pnp_warn("PnPACPI: Alloc type : %d not handle", res->id); return AE_ERROR; } return AE_OK; }