]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pnp/pnpacpi/rsparser.c
Merge git://git.infradead.org/~dwmw2/cafe-2.6
[linux-2.6-omap-h63xx.git] / drivers / pnp / pnpacpi / rsparser.c
index 3a4a644c26869bbf7b6ce10820fe65e0fb437c9c..379048fdf05dccf01575a5727219529ac7d39fac 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;
 
@@ -763,21 +776,32 @@ static void pnpacpi_encode_dma(struct acpi_resource *resource,
        struct resource *p)
 {
        /* Note: pnp_assign_dma will copy pnp_dma->flags into p->flags */
-       if (p->flags & IORESOURCE_DMA_COMPATIBLE)
-               resource->data.dma.type = ACPI_COMPATIBILITY;
-       else if (p->flags & IORESOURCE_DMA_TYPEA)
-               resource->data.dma.type = ACPI_TYPE_A;
-       else if (p->flags & IORESOURCE_DMA_TYPEB)
-               resource->data.dma.type = ACPI_TYPE_B;
-       else if (p->flags & IORESOURCE_DMA_TYPEF)
-               resource->data.dma.type = ACPI_TYPE_F;
-       if (p->flags & IORESOURCE_DMA_8BIT)
-               resource->data.dma.transfer = ACPI_TRANSFER_8;
-       else if (p->flags & IORESOURCE_DMA_8AND16BIT)
-               resource->data.dma.transfer = ACPI_TRANSFER_8_16;
-       else if (p->flags & IORESOURCE_DMA_16BIT)
-               resource->data.dma.transfer = ACPI_TRANSFER_16;
-       resource->data.dma.bus_master = p->flags & IORESOURCE_DMA_MASTER;
+       switch (p->flags & IORESOURCE_DMA_SPEED_MASK) {
+               case IORESOURCE_DMA_TYPEA:
+                       resource->data.dma.type = ACPI_TYPE_A;
+                       break;
+               case IORESOURCE_DMA_TYPEB:
+                       resource->data.dma.type = ACPI_TYPE_B;
+                       break;
+               case IORESOURCE_DMA_TYPEF:
+                       resource->data.dma.type = ACPI_TYPE_F;
+                       break;
+               default:
+                       resource->data.dma.type = ACPI_COMPATIBILITY;
+       }
+
+       switch (p->flags & IORESOURCE_DMA_TYPE_MASK) {
+               case IORESOURCE_DMA_8BIT:
+                       resource->data.dma.transfer = ACPI_TRANSFER_8;
+                       break;
+               case IORESOURCE_DMA_8AND16BIT:
+                       resource->data.dma.transfer = ACPI_TRANSFER_8_16;
+                       break;
+               default:
+                       resource->data.dma.transfer = ACPI_TRANSFER_16;
+       }
+
+       resource->data.dma.bus_master = !!(p->flags & IORESOURCE_DMA_MASTER);
        resource->data.dma.channel_count = 1;
        resource->data.dma.channels[0] = p->start;
 }