X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=drivers%2Fpnp%2Fsystem.c;h=59b90922da8c324529c4d198c23b54211168f23f;hb=76a67ec6fb79ff3570dcb5342142c16098299911;hp=d42015c382af5aa7fd106081403c490ad3673317;hpb=1da177e4c3f41524e886b7f1b8a0c1fc7321cac2;p=safe%2Fjmp%2Flinux-2.6 diff --git a/drivers/pnp/system.c b/drivers/pnp/system.c index d42015c..59b9092 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 - * + * (c) Copyright 2007 Hewlett-Packard Development Company, L.P. + * Bjorn Helgaas */ #include @@ -15,53 +16,55 @@ static const struct pnp_device_id pnp_dev_table[] = { /* General ID for reserving resources */ - { "PNP0c02", 0 }, + {"PNP0c02", 0}, /* memory controller */ - { "PNP0c01", 0 }, - { "", 0 } + {"PNP0c01", 0}, + {"", 0} }; -static void reserve_ioport_range(char *pnpid, int start, int end) +static void reserve_range(struct pnp_dev *dev, resource_size_t start, + resource_size_t end, int port) { - struct resource *res; char *regionid; + const char *pnpid = dev_name(&dev->dev); + struct resource *res; regionid = kmalloc(16, GFP_KERNEL); - if ( regionid == NULL ) + if (!regionid) 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) res->flags &= ~IORESOURCE_BUSY; + else + kfree(regionid); + /* * Failures at this point are usually harmless. pci quirks for * example do reserve stuff they know about too, so we may well * 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; + dev_info(&dev->dev, "%s range 0x%llx-0x%llx %s reserved\n", + port ? "ioport" : "iomem", + (unsigned long long) start, (unsigned long long) end, + 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) { + struct resource *res; int i; - for (i=0;iflags & IORESOURCE_DISABLED) continue; - if (pnp_port_start(dev, i) < 0x100) + if (res->start == 0) + continue; /* disabled */ + if (res->start < 0x100) /* * Below 0x100 is only standard PC hardware * (pics, kbd, timer, dma, ...) @@ -71,32 +74,32 @@ static void reserve_resources_of_dev( struct pnp_dev *dev ) * So, do nothing */ continue; - if (pnp_port_end(dev, i) < pnp_port_start(dev, i)) - /* invalid endpoint */ - /* Do nothing */ - continue; - reserve_ioport_range( - dev->dev.bus_id, - pnp_port_start(dev, i), - pnp_port_end(dev, i) - ); + if (res->end < res->start) + continue; /* invalid */ + + reserve_range(dev, res->start, res->end, 1); } - return; + for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { + if (res->flags & IORESOURCE_DISABLED) + continue; + + reserve_range(dev, res->start, res->end, 0); + } } -static int system_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id) +static int system_pnp_probe(struct pnp_dev *dev, + const struct pnp_device_id *dev_id) { reserve_resources_of_dev(dev); return 0; } static struct pnp_driver system_pnp_driver = { - .name = "system", - .id_table = pnp_dev_table, - .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, - .probe = system_pnp_probe, - .remove = NULL, + .name = "system", + .id_table = pnp_dev_table, + .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, + .probe = system_pnp_probe, }; static int __init pnp_system_init(void)