Merge ../linux-2.6
[pandora-kernel.git] / drivers / pnp / pnpacpi / rsparser.c
index 3a4a644..dc79b0a 100644 (file)
@@ -74,7 +74,7 @@ static void decode_irq_flags(int flag, int *triggering, int *polarity)
 
 static void
 pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, u32 gsi,
-       int triggering, int polarity)
+       int triggering, int polarity, int shareable)
 {
        int i = 0;
        int irq;
@@ -95,6 +95,9 @@ pnpacpi_parse_allocated_irqresource(struct pnp_resource_table *res, u32 gsi,
                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);
@@ -170,6 +173,9 @@ pnpacpi_parse_allocated_address_space(struct pnp_resource_table *res_table,
                return;
        }
 
+       if (p->producer_consumer == ACPI_PRODUCER)
+               return;
+
        if (p->resource_type == ACPI_MEMORY_RANGE)
                pnpacpi_parse_allocated_memresource(res_table,
                                p->minimum, p->address_length);
@@ -194,7 +200,8 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
                        pnpacpi_parse_allocated_irqresource(res_table,
                                res->data.irq.interrupts[i],
                                res->data.irq.triggering,
-                               res->data.irq.polarity);
+                               res->data.irq.polarity,
+                               res->data.irq.sharable);
                }
                break;
 
@@ -248,14 +255,20 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
                break;
 
        case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+               if (res->data.ext_address64.producer_consumer == ACPI_PRODUCER)
+                       return AE_OK;
                break;
 
        case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+               if (res->data.extended_irq.producer_consumer == ACPI_PRODUCER)
+                       return AE_OK;
+
                for (i = 0; i < res->data.extended_irq.interrupt_count; i++) {
                        pnpacpi_parse_allocated_irqresource(res_table,
                                res->data.extended_irq.interrupts[i],
                                res->data.extended_irq.triggering,
-                               res->data.extended_irq.polarity);
+                               res->data.extended_irq.polarity,
+                               res->data.extended_irq.sharable);
                }
                break;