Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PNP: make generic pnp_add_mem_resource()

Add a pnp_add_mem_resource() that can be used by all the PNP
backends. This consolidates a little more pnp_resource_table
knowledge into one place.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>

authored by

Bjorn Helgaas and committed by
Len Brown
d6180f36 cc8c2e30

+56 -60
+3
drivers/pnp/base.h
··· 48 48 struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, 49 49 resource_size_t start, 50 50 resource_size_t end, int flags); 51 + struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev, 52 + resource_size_t start, 53 + resource_size_t end, int flags);
+7 -12
drivers/pnp/interface.c
··· 321 321 { 322 322 struct pnp_dev *dev = to_pnp_dev(dmdev); 323 323 struct pnp_resource *pnp_res; 324 - struct resource *res; 325 324 char *buf = (void *)ubuf; 326 325 int retval = 0; 327 326 resource_size_t start, end; ··· 401 402 buf += 3; 402 403 while (isspace(*buf)) 403 404 ++buf; 404 - pnp_res = pnp_get_pnp_resource(dev, 405 - IORESOURCE_MEM, nmem); 406 - if (!pnp_res) 407 - break; 408 - pnp_res->index = nmem; 409 - res = &pnp_res->res; 410 - res->start = simple_strtoul(buf, &buf, 0); 405 + start = simple_strtoul(buf, &buf, 0); 411 406 while (isspace(*buf)) 412 407 ++buf; 413 408 if (*buf == '-') { 414 409 buf += 1; 415 410 while (isspace(*buf)) 416 411 ++buf; 417 - res->end = simple_strtoul(buf, &buf, 0); 412 + end = simple_strtoul(buf, &buf, 0); 418 413 } else 419 - res->end = res->start; 420 - res->flags = IORESOURCE_MEM; 421 - nmem++; 414 + end = start; 415 + pnp_res = pnp_add_mem_resource(dev, start, end, 416 + 0); 417 + if (pnp_res) 418 + pnp_res->index = nmem++; 422 419 continue; 423 420 } 424 421 if (!strnicmp(buf, "irq", 3)) {
+3 -7
drivers/pnp/isapnp/core.c
··· 932 932 static int isapnp_read_resources(struct pnp_dev *dev) 933 933 { 934 934 struct pnp_resource *pnp_res; 935 - struct resource *res; 936 935 int tmp, ret; 937 936 938 937 dev->active = isapnp_read_byte(ISAPNP_CFG_ACTIVATE); ··· 949 950 isapnp_read_word(ISAPNP_CFG_MEM + (tmp << 3)) << 8; 950 951 if (!ret) 951 952 continue; 952 - pnp_res = pnp_get_pnp_resource(dev, IORESOURCE_MEM, 953 - tmp); 954 - pnp_res->index = tmp; 955 - res = &pnp_res->res; 956 - res->start = ret; 957 - res->flags = IORESOURCE_MEM; 953 + pnp_res = pnp_add_mem_resource(dev, ret, ret, 0); 954 + if (pnp_res) 955 + pnp_res->index = tmp; 958 956 } 959 957 for (tmp = 0; tmp < ISAPNP_MAX_IRQ; tmp++) { 960 958 ret =
+8 -24
drivers/pnp/pnpacpi/rsparser.c
··· 173 173 } 174 174 175 175 static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev, 176 - u64 mem, u64 len, 176 + u64 start, u64 len, 177 177 int write_protect) 178 178 { 179 - struct resource *res; 180 - int i; 181 - static unsigned char warned; 179 + int flags = 0; 180 + u64 end = start + len - 1; 182 181 183 - for (i = 0; i < PNP_MAX_MEM; i++) { 184 - res = pnp_get_resource(dev, IORESOURCE_MEM, i); 185 - if (!pnp_resource_valid(res)) 186 - break; 187 - } 188 - if (i < PNP_MAX_MEM) { 189 - res->flags = IORESOURCE_MEM; // Also clears _UNSET flag 190 - if (len <= 0) { 191 - res->flags |= IORESOURCE_DISABLED; 192 - return; 193 - } 194 - if (write_protect == ACPI_READ_WRITE_MEMORY) 195 - res->flags |= IORESOURCE_MEM_WRITEABLE; 182 + if (len == 0) 183 + flags |= IORESOURCE_DISABLED; 184 + if (write_protect == ACPI_READ_WRITE_MEMORY) 185 + flags |= IORESOURCE_MEM_WRITEABLE; 196 186 197 - res->start = mem; 198 - res->end = mem + len - 1; 199 - } else if (!warned) { 200 - printk(KERN_WARNING "pnpacpi: exceeded the max number of mem " 201 - "resources: %d\n", PNP_MAX_MEM); 202 - warned = 1; 203 - } 187 + pnp_add_mem_resource(dev, start, end, flags); 204 188 } 205 189 206 190 static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev,
+6 -17
drivers/pnp/pnpbios/rsparser.c
··· 67 67 } 68 68 69 69 static void pnpbios_parse_allocated_memresource(struct pnp_dev *dev, 70 - int mem, int len) 70 + int start, int len) 71 71 { 72 - struct resource *res; 73 - int i; 72 + int flags = 0; 73 + int end = start + len - 1; 74 74 75 - for (i = 0; i < PNP_MAX_MEM; i++) { 76 - res = pnp_get_resource(dev, IORESOURCE_MEM, i); 77 - if (!pnp_resource_valid(res)) 78 - break; 79 - } 75 + if (len <= 0) 76 + flags |= IORESOURCE_DISABLED; 80 77 81 - if (i < PNP_MAX_MEM) { 82 - res->flags = IORESOURCE_MEM; // Also clears _UNSET flag 83 - if (len <= 0) { 84 - res->flags |= IORESOURCE_DISABLED; 85 - return; 86 - } 87 - res->start = (unsigned long)mem; 88 - res->end = (unsigned long)(mem + len - 1); 89 - } 78 + pnp_add_mem_resource(dev, start, end, flags); 90 79 } 91 80 92 81 static unsigned char *pnpbios_parse_allocated_resource_data(struct pnp_dev *dev,
+29
drivers/pnp/resource.c
··· 657 657 return pnp_res; 658 658 } 659 659 660 + struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev, 661 + resource_size_t start, 662 + resource_size_t end, int flags) 663 + { 664 + struct pnp_resource *pnp_res; 665 + struct resource *res; 666 + static unsigned char warned; 667 + 668 + pnp_res = pnp_new_resource(dev, IORESOURCE_MEM); 669 + if (!pnp_res) { 670 + if (!warned) { 671 + dev_err(&dev->dev, "can't add resource for MEM " 672 + "%#llx-%#llx\n",(unsigned long long) start, 673 + (unsigned long long) end); 674 + warned = 1; 675 + } 676 + return NULL; 677 + } 678 + 679 + res = &pnp_res->res; 680 + res->flags = IORESOURCE_MEM | flags; 681 + res->start = start; 682 + res->end = end; 683 + 684 + dev_dbg(&dev->dev, " add mem %#llx-%#llx flags %#x\n", 685 + (unsigned long long) start, (unsigned long long) end, flags); 686 + return pnp_res; 687 + } 688 + 660 689 /* format is: pnp_reserve_irq=irq1[,irq2] .... */ 661 690 static int __init pnp_setup_reserve_irq(char *str) 662 691 {