]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pnp/quirks.c
PNP: support optional IRQ resources
[linux-2.6-omap-h63xx.git] / drivers / pnp / quirks.c
index 48e60171b3ba5ae870966b068b84afc7f3ce013e..e8515ce0d296abf29cff2402407ed0cf99d81781 100644 (file)
@@ -121,34 +121,46 @@ static struct pnp_option *quirk_isapnp_mpu_options(struct pnp_dev *dev)
        struct pnp_option *res;
 
        /*
-        * Build a functional IRQ-less variant of each MPU option.
+        * Build a functional IRQ-optional variant of each MPU option.
         */
 
        for (res = dev->dependent; res; res = res->next) {
                struct pnp_option *curr;
                struct pnp_port *port;
-               struct pnp_port *copy;
+               struct pnp_port *copy_port;
+               struct pnp_irq *irq;
+               struct pnp_irq *copy_irq;
 
                port = res->port;
-               if (!port || !res->irq)
+               irq = res->irq;
+               if (!port || !irq)
                        continue;
 
-               copy = pnp_alloc(sizeof *copy);
-               if (!copy)
+               copy_port = pnp_alloc(sizeof *copy_port);
+               if (!copy_port)
+                       break;
+
+               copy_irq = pnp_alloc(sizeof *copy_irq);
+               if (!copy_irq) {
+                       kfree(copy_port);
                        break;
+               }
+
+               *copy_port = *port;
+               copy_port->next = NULL;
 
-               copy->min = port->min;
-               copy->max = port->max;
-               copy->align = port->align;
-               copy->size = port->size;
-               copy->flags = port->flags;
+               *copy_irq = *irq;
+               copy_irq->flags |= IORESOURCE_IRQ_OPTIONAL;
+               copy_irq->next = NULL;
 
                curr = pnp_build_option(PNP_RES_PRIORITY_FUNCTIONAL);
                if (!curr) {
-                       kfree(copy);
+                       kfree(copy_port);
+                       kfree(copy_irq);
                        break;
                }
-               curr->port = copy;
+               curr->port = copy_port;
+               curr->irq = copy_irq;
 
                if (prev)
                        prev->next = curr;
@@ -157,7 +169,7 @@ static struct pnp_option *quirk_isapnp_mpu_options(struct pnp_dev *dev)
                prev = curr;
        }
        if (head)
-               dev_info(&dev->dev, "adding IRQ-less MPU options\n");
+               dev_info(&dev->dev, "adding IRQ-optional MPU options\n");
 
        return head;
 }
@@ -167,10 +179,6 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev)
        struct pnp_option *res;
        struct pnp_irq *irq;
 
-       /*
-        * Distribute the independent IRQ over the dependent options
-        */
-
        res = dev->independent;
        if (!res)
                return;
@@ -179,33 +187,8 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev)
        if (!irq || irq->next)
                return;
 
-       res = dev->dependent;
-       if (!res)
-               return;
-
-       while (1) {
-               struct pnp_irq *copy;
-
-               copy = pnp_alloc(sizeof *copy);
-               if (!copy)
-                       break;
-
-               bitmap_copy(copy->map.bits, irq->map.bits, PNP_IRQ_NR);
-               copy->flags = irq->flags;
-
-               copy->next = res->irq; /* Yes, this is NULL */
-               res->irq = copy;
-
-               if (!res->next)
-                       break;
-               res = res->next;
-       }
-       kfree(irq);
-
-       res->next = quirk_isapnp_mpu_options(dev);
-
-       res = dev->independent;
-       res->irq = NULL;
+       irq->flags |= IORESOURCE_IRQ_OPTIONAL;
+       dev_info(&dev->dev, "made independent IRQ optional\n");
 }
 
 static void quirk_isapnp_mpu_resources(struct pnp_dev *dev)