Commit 3c29976a authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Linus Torvalds

[PATCH] pcmcia: mark parent bridge windows as resources available for PCMCIA devices

Automatically mark the parent PCI-PCI bridge windows as resources available
for PCMCIA usage.
Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 22916638
...@@ -72,7 +72,7 @@ int pcmcia_adjust_resource_info(adjust_t *adj) ...@@ -72,7 +72,7 @@ int pcmcia_adjust_resource_info(adjust_t *adj)
/* you can't use the old interface if the new /* you can't use the old interface if the new
* one was used before */ * one was used before */
spin_lock_irqsave(&s->lock, flags); spin_lock_irqsave(&s->lock, flags);
if ((s->resource_setup_done) && if ((s->resource_setup_new) &&
!(s->resource_setup_old)) { !(s->resource_setup_old)) {
spin_unlock_irqrestore(&s->lock, flags); spin_unlock_irqrestore(&s->lock, flags);
continue; continue;
......
...@@ -768,6 +768,58 @@ static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj ...@@ -768,6 +768,58 @@ static int nonstatic_adjust_resource_info(struct pcmcia_socket *s, adjust_t *adj
return CS_UNSUPPORTED_FUNCTION; return CS_UNSUPPORTED_FUNCTION;
} }
#ifdef CONFIG_PCI
static int nonstatic_autoadd_resources(struct pcmcia_socket *s)
{
struct resource *res;
int i, done = 0;
if (!s->cb_dev || !s->cb_dev->bus)
return -ENODEV;
for (i=0; i < PCI_BUS_NUM_RESOURCES; i++) {
res = s->cb_dev->bus->resource[i];
if (!res)
continue;
if (res->flags & IORESOURCE_IO) {
if (res == &ioport_resource)
continue;
printk(KERN_INFO "pcmcia: parent PCI bridge I/O window: 0x%lx - 0x%lx\n",
res->start, res->end);
if (!adjust_io(s, ADD_MANAGED_RESOURCE, res->start, res->end))
done |= IORESOURCE_IO;
}
if (res->flags & IORESOURCE_MEM) {
if (res == &iomem_resource)
continue;
printk(KERN_INFO "pcmcia: parent PCI bridge Memory window: 0x%lx - 0x%lx\n",
res->start, res->end);
if (!adjust_memory(s, ADD_MANAGED_RESOURCE, res->start, res->end))
done |= IORESOURCE_MEM;
}
}
/* if we got at least one of IO, and one of MEM, we can be glad and
* activate the PCMCIA subsystem */
if (done & (IORESOURCE_MEM | IORESOURCE_IO))
s->resource_setup_done = 1;
return 0;
}
#else
static inline int nonstatic_autoadd_resources(struct pcmcia_socket *s)
{
return -ENODEV;
}
#endif
static int nonstatic_init(struct pcmcia_socket *s) static int nonstatic_init(struct pcmcia_socket *s)
{ {
struct socket_data *data; struct socket_data *data;
...@@ -782,6 +834,8 @@ static int nonstatic_init(struct pcmcia_socket *s) ...@@ -782,6 +834,8 @@ static int nonstatic_init(struct pcmcia_socket *s)
s->resource_data = (void *) data; s->resource_data = (void *) data;
nonstatic_autoadd_resources(s);
return 0; return 0;
} }
...@@ -862,6 +916,8 @@ static ssize_t store_io_db(struct class_device *class_dev, const char *buf, size ...@@ -862,6 +916,8 @@ static ssize_t store_io_db(struct class_device *class_dev, const char *buf, size
return -EINVAL; return -EINVAL;
ret = adjust_io(s, add, start_addr, end_addr); ret = adjust_io(s, add, start_addr, end_addr);
if (!ret)
s->resource_setup_new = 1;
return ret ? ret : count; return ret ? ret : count;
} }
...@@ -912,6 +968,8 @@ static ssize_t store_mem_db(struct class_device *class_dev, const char *buf, siz ...@@ -912,6 +968,8 @@ static ssize_t store_mem_db(struct class_device *class_dev, const char *buf, siz
return -EINVAL; return -EINVAL;
ret = adjust_memory(s, add, start_addr, end_addr); ret = adjust_memory(s, add, start_addr, end_addr);
if (!ret)
s->resource_setup_new = 1;
return ret ? ret : count; return ret ? ret : count;
} }
......
...@@ -216,8 +216,9 @@ struct pcmcia_socket { ...@@ -216,8 +216,9 @@ struct pcmcia_socket {
/* is set to one if resource setup is done using adjust_resource_info() */ /* is set to one if resource setup is done using adjust_resource_info() */
u8 resource_setup_old:1; u8 resource_setup_old:1;
u8 resource_setup_new:1;
u8 reserved:6; u8 reserved:5;
/* socket operations */ /* socket operations */
struct pccard_operations * ops; struct pccard_operations * ops;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment