Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 102043
b: refs/heads/master
c: 57fd51a
h: refs/heads/master
i:
  102041: a703f9f
  102039: b13f1a6
v: v3
  • Loading branch information
Bjorn Helgaas authored and Andi Kleen committed Jul 16, 2008
1 parent 5e854c0 commit e0bc308
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 18 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: f61ed7e32d2d6a0a8c3c101da513ccedd542e14d
refs/heads/master: 57fd51a8be26921b56747ddd09d1d9e01c11c9e0
62 changes: 62 additions & 0 deletions trunk/drivers/pnp/resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,68 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev,
return pnp_res;
}

static int pnp_possible_option(struct pnp_option *option, int type,
resource_size_t start, resource_size_t size)
{
struct pnp_option *tmp;
struct pnp_port *port;
struct pnp_mem *mem;
struct pnp_irq *irq;
struct pnp_dma *dma;

if (!option)
return 0;

for (tmp = option; tmp; tmp = tmp->next) {
switch (type) {
case IORESOURCE_IO:
for (port = tmp->port; port; port = port->next) {
if (port->min == start && port->size == size)
return 1;
}
break;
case IORESOURCE_MEM:
for (mem = tmp->mem; mem; mem = mem->next) {
if (mem->min == start && mem->size == size)
return 1;
}
break;
case IORESOURCE_IRQ:
for (irq = tmp->irq; irq; irq = irq->next) {
if (start < PNP_IRQ_NR &&
test_bit(start, irq->map))
return 1;
}
break;
case IORESOURCE_DMA:
for (dma = tmp->dma; dma; dma = dma->next) {
if (dma->map & (1 << start))
return 1;
}
break;
}
}

return 0;
}

/*
* Determine whether the specified resource is a possible configuration
* for this device.
*/
int pnp_possible_config(struct pnp_dev *dev, int type, resource_size_t start,
resource_size_t size)
{
if (pnp_possible_option(dev->independent, type, start, size))
return 1;

if (pnp_possible_option(dev->dependent, type, start, size))
return 1;

return 0;
}
EXPORT_SYMBOL(pnp_possible_config);

/* format is: pnp_reserve_irq=irq1[,irq2] .... */
static int __init pnp_setup_reserve_irq(char *str)
{
Expand Down
24 changes: 7 additions & 17 deletions trunk/drivers/serial/8250_pnp.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,21 +383,14 @@ static int __devinit check_name(char *name)
return 0;
}

static int __devinit check_resources(struct pnp_option *option)
static int __devinit check_resources(struct pnp_dev *dev)
{
struct pnp_option *tmp;
if (!option)
return 0;
resource_size_t base[] = {0x2f8, 0x3f8, 0x2e8, 0x3e8};
int i;

for (tmp = option; tmp; tmp = tmp->next) {
struct pnp_port *port;
for (port = tmp->port; port; port = port->next)
if ((port->size == 8) &&
((port->min == 0x2f8) ||
(port->min == 0x3f8) ||
(port->min == 0x2e8) ||
(port->min == 0x3e8)))
return 1;
for (i = 0; i < ARRAY_SIZE(base); i++) {
if (pnp_possible_config(dev, IORESOURCE_IO, base[i], 8))
return 1;
}

return 0;
Expand All @@ -420,10 +413,7 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags)
(dev->card && check_name(dev->card->name))))
return -ENODEV;

if (check_resources(dev->independent))
return 0;

if (check_resources(dev->dependent))
if (check_resources(dev))
return 0;

return -ENODEV;
Expand Down
5 changes: 5 additions & 0 deletions trunk/include/linux/pnp.h
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,8 @@ void pnp_unregister_card_driver(struct pnp_card_driver *drv);
extern struct list_head pnp_cards;

/* resource management */
int pnp_possible_config(struct pnp_dev *dev, int type, resource_size_t base,
resource_size_t size);
int pnp_auto_config_dev(struct pnp_dev *dev);
int pnp_start_dev(struct pnp_dev *dev);
int pnp_stop_dev(struct pnp_dev *dev);
Expand Down Expand Up @@ -506,6 +508,9 @@ static inline int pnp_register_card_driver(struct pnp_card_driver *drv) { return
static inline void pnp_unregister_card_driver(struct pnp_card_driver *drv) { }

/* resource management */
static inline int pnp_possible_config(struct pnp_dev *dev, int type,
resource_size_t base,
resource_size_t size) { return 0; }
static inline int pnp_auto_config_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_start_dev(struct pnp_dev *dev) { return -ENODEV; }
static inline int pnp_stop_dev(struct pnp_dev *dev) { return -ENODEV; }
Expand Down

0 comments on commit e0bc308

Please sign in to comment.