Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 102056
b: refs/heads/master
c: d5ebde6
h: refs/heads/master
v: v3
  • Loading branch information
Bjorn Helgaas authored and Andi Kleen committed Jul 16, 2008
1 parent 7264565 commit 094336f
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 45 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2d29a7a794c5bae982955cd5dd0a76e766e57f39
refs/heads/master: d5ebde6ef5c2d51828f975a81d7d0e58bccfd833
2 changes: 2 additions & 0 deletions trunk/drivers/pnp/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ static void pnp_print_irq(pnp_info_buffer_t * buffer, char *space,
pnp_printf(buffer, " High-Level");
if (irq->flags & IORESOURCE_IRQ_LOWLEVEL)
pnp_printf(buffer, " Low-Level");
if (irq->flags & IORESOURCE_IRQ_OPTIONAL)
pnp_printf(buffer, " (optional)");
pnp_printf(buffer, "\n");
}

Expand Down
9 changes: 9 additions & 0 deletions trunk/drivers/pnp/manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,15 @@ static int pnp_assign_irq(struct pnp_dev *dev, struct pnp_irq *rule, int idx)
goto __add;
}
}

if (rule->flags & IORESOURCE_IRQ_OPTIONAL) {
res->start = -1;
res->end = -1;
res->flags |= IORESOURCE_DISABLED;
dev_dbg(&dev->dev, " irq %d disabled (optional)\n", idx);
goto __add;
}

dev_dbg(&dev->dev, " couldn't assign irq %d\n", idx);
return -EBUSY;

Expand Down
71 changes: 27 additions & 44 deletions trunk/drivers/pnp/quirks.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}
Expand All @@ -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;
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/ioport.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ struct resource_list {
#define IORESOURCE_IRQ_HIGHLEVEL (1<<2)
#define IORESOURCE_IRQ_LOWLEVEL (1<<3)
#define IORESOURCE_IRQ_SHAREABLE (1<<4)
#define IORESOURCE_IRQ_OPTIONAL (1<<5)

/* PnP DMA specific bits (IORESOURCE_BITS) */
#define IORESOURCE_DMA_TYPE_MASK (3<<0)
Expand Down

0 comments on commit 094336f

Please sign in to comment.