diff options
| -rw-r--r-- | drivers/pnp/interface.c | 41 | ||||
| -rw-r--r-- | drivers/pnp/quirks.c | 13 | ||||
| -rw-r--r-- | drivers/pnp/resource.c | 48 | ||||
| -rw-r--r-- | drivers/pnp/system.c | 21 |
4 files changed, 60 insertions, 63 deletions
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index a608054a3e53..e9e66ed4fa31 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
| @@ -248,6 +248,7 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, | |||
| 248 | char *buf) | 248 | char *buf) |
| 249 | { | 249 | { |
| 250 | struct pnp_dev *dev = to_pnp_dev(dmdev); | 250 | struct pnp_dev *dev = to_pnp_dev(dmdev); |
| 251 | struct resource *res; | ||
| 251 | int i, ret; | 252 | int i, ret; |
| 252 | pnp_info_buffer_t *buffer; | 253 | pnp_info_buffer_t *buffer; |
| 253 | 254 | ||
| @@ -267,50 +268,46 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, | |||
| 267 | else | 268 | else |
| 268 | pnp_printf(buffer, "disabled\n"); | 269 | pnp_printf(buffer, "disabled\n"); |
| 269 | 270 | ||
| 270 | for (i = 0; i < PNP_MAX_PORT; i++) { | 271 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) { |
| 271 | if (pnp_port_valid(dev, i)) { | 272 | if (pnp_resource_valid(res)) { |
| 272 | pnp_printf(buffer, "io"); | 273 | pnp_printf(buffer, "io"); |
| 273 | if (pnp_port_flags(dev, i) & IORESOURCE_DISABLED) | 274 | if (res->flags & IORESOURCE_DISABLED) |
| 274 | pnp_printf(buffer, " disabled\n"); | 275 | pnp_printf(buffer, " disabled\n"); |
| 275 | else | 276 | else |
| 276 | pnp_printf(buffer, " 0x%llx-0x%llx\n", | 277 | pnp_printf(buffer, " 0x%llx-0x%llx\n", |
| 277 | (unsigned long long) | 278 | (unsigned long long) res->start, |
| 278 | pnp_port_start(dev, i), | 279 | (unsigned long long) res->end); |
| 279 | (unsigned long long)pnp_port_end(dev, | ||
| 280 | i)); | ||
| 281 | } | 280 | } |
| 282 | } | 281 | } |
| 283 | for (i = 0; i < PNP_MAX_MEM; i++) { | 282 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { |
| 284 | if (pnp_mem_valid(dev, i)) { | 283 | if (pnp_resource_valid(res)) { |
| 285 | pnp_printf(buffer, "mem"); | 284 | pnp_printf(buffer, "mem"); |
| 286 | if (pnp_mem_flags(dev, i) & IORESOURCE_DISABLED) | 285 | if (res->flags & IORESOURCE_DISABLED) |
| 287 | pnp_printf(buffer, " disabled\n"); | 286 | pnp_printf(buffer, " disabled\n"); |
| 288 | else | 287 | else |
| 289 | pnp_printf(buffer, " 0x%llx-0x%llx\n", | 288 | pnp_printf(buffer, " 0x%llx-0x%llx\n", |
| 290 | (unsigned long long) | 289 | (unsigned long long) res->start, |
| 291 | pnp_mem_start(dev, i), | 290 | (unsigned long long) res->end); |
| 292 | (unsigned long long)pnp_mem_end(dev, | ||
| 293 | i)); | ||
| 294 | } | 291 | } |
| 295 | } | 292 | } |
| 296 | for (i = 0; i < PNP_MAX_IRQ; i++) { | 293 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IRQ, i)); i++) { |
| 297 | if (pnp_irq_valid(dev, i)) { | 294 | if (pnp_resource_valid(res)) { |
| 298 | pnp_printf(buffer, "irq"); | 295 | pnp_printf(buffer, "irq"); |
| 299 | if (pnp_irq_flags(dev, i) & IORESOURCE_DISABLED) | 296 | if (res->flags & IORESOURCE_DISABLED) |
| 300 | pnp_printf(buffer, " disabled\n"); | 297 | pnp_printf(buffer, " disabled\n"); |
| 301 | else | 298 | else |
| 302 | pnp_printf(buffer, " %lld\n", | 299 | pnp_printf(buffer, " %lld\n", |
| 303 | (unsigned long long)pnp_irq(dev, i)); | 300 | (unsigned long long) res->start); |
| 304 | } | 301 | } |
| 305 | } | 302 | } |
| 306 | for (i = 0; i < PNP_MAX_DMA; i++) { | 303 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_DMA, i)); i++) { |
| 307 | if (pnp_dma_valid(dev, i)) { | 304 | if (pnp_resource_valid(res)) { |
| 308 | pnp_printf(buffer, "dma"); | 305 | pnp_printf(buffer, "dma"); |
| 309 | if (pnp_dma_flags(dev, i) & IORESOURCE_DISABLED) | 306 | if (res->flags & IORESOURCE_DISABLED) |
| 310 | pnp_printf(buffer, " disabled\n"); | 307 | pnp_printf(buffer, " disabled\n"); |
| 311 | else | 308 | else |
| 312 | pnp_printf(buffer, " %lld\n", | 309 | pnp_printf(buffer, " %lld\n", |
| 313 | (unsigned long long)pnp_dma(dev, i)); | 310 | (unsigned long long) res->start); |
| 314 | } | 311 | } |
| 315 | } | 312 | } |
| 316 | ret = (buffer->curr - buf); | 313 | ret = (buffer->curr - buf); |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index c47dd252f449..d049a2279fea 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
| @@ -138,13 +138,15 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) | |||
| 138 | 138 | ||
| 139 | pci_start = pci_resource_start(pdev, i); | 139 | pci_start = pci_resource_start(pdev, i); |
| 140 | pci_end = pci_resource_end(pdev, i); | 140 | pci_end = pci_resource_end(pdev, i); |
| 141 | for (j = 0; j < PNP_MAX_MEM; j++) { | 141 | for (j = 0; |
| 142 | if (!pnp_mem_valid(dev, j) || | 142 | (res = pnp_get_resource(dev, IORESOURCE_MEM, j)); |
| 143 | pnp_mem_len(dev, j) == 0) | 143 | j++) { |
| 144 | if (res->flags & IORESOURCE_UNSET || | ||
| 145 | (res->start == 0 && res->end == 0)) | ||
| 144 | continue; | 146 | continue; |
| 145 | 147 | ||
| 146 | pnp_start = pnp_mem_start(dev, j); | 148 | pnp_start = res->start; |
| 147 | pnp_end = pnp_mem_end(dev, j); | 149 | pnp_end = res->end; |
| 148 | 150 | ||
| 149 | /* | 151 | /* |
| 150 | * If the PNP region doesn't overlap the PCI | 152 | * If the PNP region doesn't overlap the PCI |
| @@ -177,7 +179,6 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) | |||
| 177 | pci_name(pdev), i, | 179 | pci_name(pdev), i, |
| 178 | (unsigned long long) pci_start, | 180 | (unsigned long long) pci_start, |
| 179 | (unsigned long long) pci_end); | 181 | (unsigned long long) pci_end); |
| 180 | res = pnp_get_resource(dev, IORESOURCE_MEM, j); | ||
| 181 | res->flags = 0; | 182 | res->flags = 0; |
| 182 | } | 183 | } |
| 183 | } | 184 | } |
diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index b2516d62fcf6..84362818fa8b 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c | |||
| @@ -269,9 +269,8 @@ int pnp_check_port(struct pnp_dev *dev, struct resource *res) | |||
| 269 | } | 269 | } |
| 270 | 270 | ||
| 271 | /* check for internal conflicts */ | 271 | /* check for internal conflicts */ |
| 272 | for (i = 0; i < PNP_MAX_PORT; i++) { | 272 | for (i = 0; (tres = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) { |
| 273 | tres = pnp_get_resource(dev, IORESOURCE_IO, i); | 273 | if (tres != res && tres->flags & IORESOURCE_IO) { |
| 274 | if (tres && tres != res && tres->flags & IORESOURCE_IO) { | ||
| 275 | tport = &tres->start; | 274 | tport = &tres->start; |
| 276 | tend = &tres->end; | 275 | tend = &tres->end; |
| 277 | if (ranged_conflict(port, end, tport, tend)) | 276 | if (ranged_conflict(port, end, tport, tend)) |
| @@ -283,9 +282,10 @@ int pnp_check_port(struct pnp_dev *dev, struct resource *res) | |||
| 283 | pnp_for_each_dev(tdev) { | 282 | pnp_for_each_dev(tdev) { |
| 284 | if (tdev == dev) | 283 | if (tdev == dev) |
| 285 | continue; | 284 | continue; |
| 286 | for (i = 0; i < PNP_MAX_PORT; i++) { | 285 | for (i = 0; |
| 287 | tres = pnp_get_resource(tdev, IORESOURCE_IO, i); | 286 | (tres = pnp_get_resource(tdev, IORESOURCE_IO, i)); |
| 288 | if (tres && tres->flags & IORESOURCE_IO) { | 287 | i++) { |
| 288 | if (tres->flags & IORESOURCE_IO) { | ||
| 289 | if (cannot_compare(tres->flags)) | 289 | if (cannot_compare(tres->flags)) |
| 290 | continue; | 290 | continue; |
| 291 | tport = &tres->start; | 291 | tport = &tres->start; |
| @@ -329,9 +329,8 @@ int pnp_check_mem(struct pnp_dev *dev, struct resource *res) | |||
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | /* check for internal conflicts */ | 331 | /* check for internal conflicts */ |
| 332 | for (i = 0; i < PNP_MAX_MEM; i++) { | 332 | for (i = 0; (tres = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { |
| 333 | tres = pnp_get_resource(dev, IORESOURCE_MEM, i); | 333 | if (tres != res && tres->flags & IORESOURCE_MEM) { |
| 334 | if (tres && tres != res && tres->flags & IORESOURCE_MEM) { | ||
| 335 | taddr = &tres->start; | 334 | taddr = &tres->start; |
| 336 | tend = &tres->end; | 335 | tend = &tres->end; |
| 337 | if (ranged_conflict(addr, end, taddr, tend)) | 336 | if (ranged_conflict(addr, end, taddr, tend)) |
| @@ -343,9 +342,10 @@ int pnp_check_mem(struct pnp_dev *dev, struct resource *res) | |||
| 343 | pnp_for_each_dev(tdev) { | 342 | pnp_for_each_dev(tdev) { |
| 344 | if (tdev == dev) | 343 | if (tdev == dev) |
| 345 | continue; | 344 | continue; |
| 346 | for (i = 0; i < PNP_MAX_MEM; i++) { | 345 | for (i = 0; |
| 347 | tres = pnp_get_resource(tdev, IORESOURCE_MEM, i); | 346 | (tres = pnp_get_resource(tdev, IORESOURCE_MEM, i)); |
| 348 | if (tres && tres->flags & IORESOURCE_MEM) { | 347 | i++) { |
| 348 | if (tres->flags & IORESOURCE_MEM) { | ||
| 349 | if (cannot_compare(tres->flags)) | 349 | if (cannot_compare(tres->flags)) |
| 350 | continue; | 350 | continue; |
| 351 | taddr = &tres->start; | 351 | taddr = &tres->start; |
| @@ -388,9 +388,8 @@ int pnp_check_irq(struct pnp_dev *dev, struct resource *res) | |||
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | /* check for internal conflicts */ | 390 | /* check for internal conflicts */ |
| 391 | for (i = 0; i < PNP_MAX_IRQ; i++) { | 391 | for (i = 0; (tres = pnp_get_resource(dev, IORESOURCE_IRQ, i)); i++) { |
| 392 | tres = pnp_get_resource(dev, IORESOURCE_IRQ, i); | 392 | if (tres != res && tres->flags & IORESOURCE_IRQ) { |
| 393 | if (tres && tres != res && tres->flags & IORESOURCE_IRQ) { | ||
| 394 | if (tres->start == *irq) | 393 | if (tres->start == *irq) |
| 395 | return 0; | 394 | return 0; |
| 396 | } | 395 | } |
| @@ -422,9 +421,10 @@ int pnp_check_irq(struct pnp_dev *dev, struct resource *res) | |||
| 422 | pnp_for_each_dev(tdev) { | 421 | pnp_for_each_dev(tdev) { |
| 423 | if (tdev == dev) | 422 | if (tdev == dev) |
| 424 | continue; | 423 | continue; |
| 425 | for (i = 0; i < PNP_MAX_IRQ; i++) { | 424 | for (i = 0; |
| 426 | tres = pnp_get_resource(tdev, IORESOURCE_IRQ, i); | 425 | (tres = pnp_get_resource(tdev, IORESOURCE_IRQ, i)); |
| 427 | if (tres && tres->flags & IORESOURCE_IRQ) { | 426 | i++) { |
| 427 | if (tres->flags & IORESOURCE_IRQ) { | ||
| 428 | if (cannot_compare(tres->flags)) | 428 | if (cannot_compare(tres->flags)) |
| 429 | continue; | 429 | continue; |
| 430 | if (tres->start == *irq) | 430 | if (tres->start == *irq) |
| @@ -461,9 +461,8 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res) | |||
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | /* check for internal conflicts */ | 463 | /* check for internal conflicts */ |
| 464 | for (i = 0; i < PNP_MAX_DMA; i++) { | 464 | for (i = 0; (tres = pnp_get_resource(dev, IORESOURCE_DMA, i)); i++) { |
| 465 | tres = pnp_get_resource(dev, IORESOURCE_DMA, i); | 465 | if (tres != res && tres->flags & IORESOURCE_DMA) { |
| 466 | if (tres && tres != res && tres->flags & IORESOURCE_DMA) { | ||
| 467 | if (tres->start == *dma) | 466 | if (tres->start == *dma) |
| 468 | return 0; | 467 | return 0; |
| 469 | } | 468 | } |
| @@ -481,9 +480,10 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res) | |||
| 481 | pnp_for_each_dev(tdev) { | 480 | pnp_for_each_dev(tdev) { |
| 482 | if (tdev == dev) | 481 | if (tdev == dev) |
| 483 | continue; | 482 | continue; |
| 484 | for (i = 0; i < PNP_MAX_DMA; i++) { | 483 | for (i = 0; |
| 485 | tres = pnp_get_resource(tdev, IORESOURCE_DMA, i); | 484 | (tres = pnp_get_resource(tdev, IORESOURCE_DMA, i)); |
| 486 | if (tres && tres->flags & IORESOURCE_DMA) { | 485 | i++) { |
| 486 | if (tres->flags & IORESOURCE_DMA) { | ||
| 487 | if (cannot_compare(tres->flags)) | 487 | if (cannot_compare(tres->flags)) |
| 488 | continue; | 488 | continue; |
| 489 | if (tres->start == *dma) | 489 | if (tres->start == *dma) |
diff --git a/drivers/pnp/system.c b/drivers/pnp/system.c index 55c4563986b3..9c2496dbeee4 100644 --- a/drivers/pnp/system.c +++ b/drivers/pnp/system.c | |||
| @@ -56,14 +56,15 @@ static void reserve_range(struct pnp_dev *dev, resource_size_t start, | |||
| 56 | 56 | ||
| 57 | static void reserve_resources_of_dev(struct pnp_dev *dev) | 57 | static void reserve_resources_of_dev(struct pnp_dev *dev) |
| 58 | { | 58 | { |
| 59 | struct resource *res; | ||
| 59 | int i; | 60 | int i; |
| 60 | 61 | ||
| 61 | for (i = 0; i < PNP_MAX_PORT; i++) { | 62 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_IO, i)); i++) { |
| 62 | if (!pnp_port_valid(dev, i)) | 63 | if (res->flags & IORESOURCE_UNSET) |
| 63 | continue; | 64 | continue; |
| 64 | if (pnp_port_start(dev, i) == 0) | 65 | if (res->start == 0) |
| 65 | continue; /* disabled */ | 66 | continue; /* disabled */ |
| 66 | if (pnp_port_start(dev, i) < 0x100) | 67 | if (res->start < 0x100) |
| 67 | /* | 68 | /* |
| 68 | * Below 0x100 is only standard PC hardware | 69 | * Below 0x100 is only standard PC hardware |
| 69 | * (pics, kbd, timer, dma, ...) | 70 | * (pics, kbd, timer, dma, ...) |
| @@ -73,19 +74,17 @@ static void reserve_resources_of_dev(struct pnp_dev *dev) | |||
| 73 | * So, do nothing | 74 | * So, do nothing |
| 74 | */ | 75 | */ |
| 75 | continue; | 76 | continue; |
| 76 | if (pnp_port_end(dev, i) < pnp_port_start(dev, i)) | 77 | if (res->end < res->start) |
| 77 | continue; /* invalid */ | 78 | continue; /* invalid */ |
| 78 | 79 | ||
| 79 | reserve_range(dev, pnp_port_start(dev, i), | 80 | reserve_range(dev, res->start, res->end, 1); |
| 80 | pnp_port_end(dev, i), 1); | ||
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | for (i = 0; i < PNP_MAX_MEM; i++) { | 83 | for (i = 0; (res = pnp_get_resource(dev, IORESOURCE_MEM, i)); i++) { |
| 84 | if (!pnp_mem_valid(dev, i)) | 84 | if (res->flags & IORESOURCE_UNSET) |
| 85 | continue; | 85 | continue; |
| 86 | 86 | ||
| 87 | reserve_range(dev, pnp_mem_start(dev, i), | 87 | reserve_range(dev, res->start, res->end, 0); |
| 88 | pnp_mem_end(dev, i), 0); | ||
| 89 | } | 88 | } |
| 90 | } | 89 | } |
| 91 | 90 | ||
