diff options
Diffstat (limited to 'drivers/pnp/system.c')
-rw-r--r-- | drivers/pnp/system.c | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/drivers/pnp/system.c b/drivers/pnp/system.c index d42015c382a..2065e74bb63 100644 --- a/drivers/pnp/system.c +++ b/drivers/pnp/system.c @@ -3,7 +3,8 @@ * * Some code is based on pnpbios_core.c * Copyright 2002 Adam Belay <ambx1@neo.rr.com> - * + * (c) Copyright 2007 Hewlett-Packard Development Company, L.P. + * Bjorn Helgaas <bjorn.helgaas@hp.com> */ #include <linux/pnp.h> @@ -21,18 +22,21 @@ static const struct pnp_device_id pnp_dev_table[] = { { "", 0 } }; -static void reserve_ioport_range(char *pnpid, int start, int end) +static void reserve_range(char *pnpid, int start, int end, int port) { struct resource *res; char *regionid; regionid = kmalloc(16, GFP_KERNEL); - if ( regionid == NULL ) + if (regionid == NULL) return; snprintf(regionid, 16, "pnp %s", pnpid); - res = request_region(start,end-start+1,regionid); - if ( res == NULL ) - kfree( regionid ); + if (port) + res = request_region(start,end-start+1,regionid); + else + res = request_mem_region(start,end-start+1,regionid); + if (res == NULL) + kfree(regionid); else res->flags &= ~IORESOURCE_BUSY; /* @@ -41,26 +45,20 @@ static void reserve_ioport_range(char *pnpid, int start, int end) * have double reservations. */ printk(KERN_INFO - "pnp: %s: ioport range 0x%x-0x%x %s reserved\n", - pnpid, start, end, - NULL != res ? "has been" : "could not be" - ); - - return; + "pnp: %s: %s range 0x%x-0x%x %s reserved\n", + pnpid, port ? "ioport" : "iomem", start, end, + NULL != res ? "has been" : "could not be"); } -static void reserve_resources_of_dev( struct pnp_dev *dev ) +static void reserve_resources_of_dev(struct pnp_dev *dev) { int i; - for (i=0;i<PNP_MAX_PORT;i++) { + for (i = 0; i < PNP_MAX_PORT; i++) { if (!pnp_port_valid(dev, i)) - /* end of resources */ continue; if (pnp_port_start(dev, i) == 0) - /* disabled */ - /* Do nothing */ - continue; + continue; /* disabled */ if (pnp_port_start(dev, i) < 0x100) /* * Below 0x100 is only standard PC hardware @@ -72,14 +70,18 @@ static void reserve_resources_of_dev( struct pnp_dev *dev ) */ continue; if (pnp_port_end(dev, i) < pnp_port_start(dev, i)) - /* invalid endpoint */ - /* Do nothing */ + continue; /* invalid */ + + reserve_range(dev->dev.bus_id, pnp_port_start(dev, i), + pnp_port_end(dev, i), 1); + } + + for (i = 0; i < PNP_MAX_MEM; i++) { + if (!pnp_mem_valid(dev, i)) continue; - reserve_ioport_range( - dev->dev.bus_id, - pnp_port_start(dev, i), - pnp_port_end(dev, i) - ); + + reserve_range(dev->dev.bus_id, pnp_mem_start(dev, i), + pnp_mem_end(dev, i), 0); } return; |