|
@@ -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)
|