diff options
| -rw-r--r-- | drivers/pnp/base.h | 3 | ||||
| -rw-r--r-- | drivers/pnp/interface.c | 19 | ||||
| -rw-r--r-- | drivers/pnp/isapnp/core.c | 10 | ||||
| -rw-r--r-- | drivers/pnp/pnpacpi/rsparser.c | 34 | ||||
| -rw-r--r-- | drivers/pnp/pnpbios/rsparser.c | 23 | ||||
| -rw-r--r-- | drivers/pnp/resource.c | 29 |
6 files changed, 57 insertions, 61 deletions
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h index bfb08abc311b..9b7bb62c98b1 100644 --- a/drivers/pnp/base.h +++ b/drivers/pnp/base.h | |||
| @@ -48,3 +48,6 @@ struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma, | |||
| 48 | struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, | 48 | struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, |
| 49 | resource_size_t start, | 49 | resource_size_t start, |
| 50 | resource_size_t end, int flags); | 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); | ||
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index 77d8bf01b485..5d9301de1778 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
| @@ -321,7 +321,6 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, | |||
| 321 | { | 321 | { |
| 322 | struct pnp_dev *dev = to_pnp_dev(dmdev); | 322 | struct pnp_dev *dev = to_pnp_dev(dmdev); |
| 323 | struct pnp_resource *pnp_res; | 323 | struct pnp_resource *pnp_res; |
| 324 | struct resource *res; | ||
| 325 | char *buf = (void *)ubuf; | 324 | char *buf = (void *)ubuf; |
| 326 | int retval = 0; | 325 | int retval = 0; |
| 327 | resource_size_t start, end; | 326 | resource_size_t start, end; |
| @@ -402,24 +401,20 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, | |||
| 402 | buf += 3; | 401 | buf += 3; |
| 403 | while (isspace(*buf)) | 402 | while (isspace(*buf)) |
| 404 | ++buf; | 403 | ++buf; |
| 405 | pnp_res = pnp_get_pnp_resource(dev, | 404 | start = simple_strtoul(buf, &buf, 0); |
| 406 | IORESOURCE_MEM, nmem); | ||
| 407 | if (!pnp_res) | ||
| 408 | break; | ||
| 409 | pnp_res->index = nmem; | ||
| 410 | res = &pnp_res->res; | ||
| 411 | res->start = simple_strtoul(buf, &buf, 0); | ||
| 412 | while (isspace(*buf)) | 405 | while (isspace(*buf)) |
| 413 | ++buf; | 406 | ++buf; |
| 414 | if (*buf == '-') { | 407 | if (*buf == '-') { |
| 415 | buf += 1; | 408 | buf += 1; |
| 416 | while (isspace(*buf)) | 409 | while (isspace(*buf)) |
| 417 | ++buf; | 410 | ++buf; |
| 418 | res->end = simple_strtoul(buf, &buf, 0); | 411 | end = simple_strtoul(buf, &buf, 0); |
| 419 | } else | 412 | } else |
| 420 | res->end = res->start; | 413 | end = start; |
| 421 | res->flags = IORESOURCE_MEM; | 414 | pnp_res = pnp_add_mem_resource(dev, start, end, |
| 422 | nmem++; | 415 | 0); |
| 416 | if (pnp_res) | ||
| 417 | pnp_res->index = nmem++; | ||
| 423 | continue; | 418 | continue; |
| 424 | } | 419 | } |
| 425 | if (!strnicmp(buf, "irq", 3)) { | 420 | if (!strnicmp(buf, "irq", 3)) { |
diff --git a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c index bdd8508090da..f08399497e4c 100644 --- a/drivers/pnp/isapnp/core.c +++ b/drivers/pnp/isapnp/core.c | |||
| @@ -932,7 +932,6 @@ EXPORT_SYMBOL(isapnp_write_byte); | |||
| 932 | static int isapnp_read_resources(struct pnp_dev *dev) | 932 | static int isapnp_read_resources(struct pnp_dev *dev) |
| 933 | { | 933 | { |
| 934 | struct pnp_resource *pnp_res; | 934 | struct pnp_resource *pnp_res; |
| 935 | struct resource *res; | ||
| 936 | int tmp, ret; | 935 | int tmp, ret; |
| 937 | 936 | ||
| 938 | dev->active = isapnp_read_byte(ISAPNP_CFG_ACTIVATE); | 937 | dev->active = isapnp_read_byte(ISAPNP_CFG_ACTIVATE); |
| @@ -950,12 +949,9 @@ static int isapnp_read_resources(struct pnp_dev *dev) | |||
| 950 | isapnp_read_word(ISAPNP_CFG_MEM + (tmp << 3)) << 8; | 949 | isapnp_read_word(ISAPNP_CFG_MEM + (tmp << 3)) << 8; |
| 951 | if (!ret) | 950 | if (!ret) |
| 952 | continue; | 951 | continue; |
| 953 | pnp_res = pnp_get_pnp_resource(dev, IORESOURCE_MEM, | 952 | pnp_res = pnp_add_mem_resource(dev, ret, ret, 0); |
| 954 | tmp); | 953 | if (pnp_res) |
| 955 | pnp_res->index = tmp; | 954 | pnp_res->index = tmp; |
| 956 | res = &pnp_res->res; | ||
| 957 | res->start = ret; | ||
| 958 | res->flags = IORESOURCE_MEM; | ||
| 959 | } | 955 | } |
| 960 | for (tmp = 0; tmp < ISAPNP_MAX_IRQ; tmp++) { | 956 | for (tmp = 0; tmp < ISAPNP_MAX_IRQ; tmp++) { |
| 961 | ret = | 957 | ret = |
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c index d3ca8e035c19..a512908bf4e3 100644 --- a/drivers/pnp/pnpacpi/rsparser.c +++ b/drivers/pnp/pnpacpi/rsparser.c | |||
| @@ -173,34 +173,18 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start, | |||
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev, | 175 | static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev, |
| 176 | u64 mem, u64 len, | 176 | u64 start, u64 len, |
| 177 | int write_protect) | 177 | int write_protect) |
| 178 | { | 178 | { |
| 179 | struct resource *res; | 179 | int flags = 0; |
| 180 | int i; | 180 | u64 end = start + len - 1; |
| 181 | static unsigned char warned; | ||
| 182 | 181 | ||
| 183 | for (i = 0; i < PNP_MAX_MEM; i++) { | 182 | if (len == 0) |
| 184 | res = pnp_get_resource(dev, IORESOURCE_MEM, i); | 183 | flags |= IORESOURCE_DISABLED; |
| 185 | if (!pnp_resource_valid(res)) | 184 | if (write_protect == ACPI_READ_WRITE_MEMORY) |
| 186 | break; | 185 | flags |= IORESOURCE_MEM_WRITEABLE; |
| 187 | } | 186 | |
| 188 | if (i < PNP_MAX_MEM) { | 187 | pnp_add_mem_resource(dev, start, end, flags); |
| 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; | ||
| 196 | |||
| 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 | } | ||
| 204 | } | 188 | } |
| 205 | 189 | ||
| 206 | static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev, | 190 | static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev, |
diff --git a/drivers/pnp/pnpbios/rsparser.c b/drivers/pnp/pnpbios/rsparser.c index 8c83bc16a9be..ed63ecd9bf40 100644 --- a/drivers/pnp/pnpbios/rsparser.c +++ b/drivers/pnp/pnpbios/rsparser.c | |||
| @@ -67,26 +67,15 @@ static void pnpbios_parse_allocated_ioresource(struct pnp_dev *dev, | |||
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static void pnpbios_parse_allocated_memresource(struct pnp_dev *dev, | 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; | 72 | int flags = 0; |
| 73 | int i; | 73 | int end = start + len - 1; |
| 74 | 74 | ||
| 75 | for (i = 0; i < PNP_MAX_MEM; i++) { | 75 | if (len <= 0) |
| 76 | res = pnp_get_resource(dev, IORESOURCE_MEM, i); | 76 | flags |= IORESOURCE_DISABLED; |
| 77 | if (!pnp_resource_valid(res)) | ||
| 78 | break; | ||
| 79 | } | ||
| 80 | 77 | ||
| 81 | if (i < PNP_MAX_MEM) { | 78 | pnp_add_mem_resource(dev, start, end, flags); |
| 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 | } | ||
| 90 | } | 79 | } |
| 91 | 80 | ||
| 92 | static unsigned char *pnpbios_parse_allocated_resource_data(struct pnp_dev *dev, | 81 | static unsigned char *pnpbios_parse_allocated_resource_data(struct pnp_dev *dev, |
diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index 64387b70026a..2041620d5682 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c | |||
| @@ -657,6 +657,35 @@ struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, | |||
| 657 | return pnp_res; | 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 | /* format is: pnp_reserve_irq=irq1[,irq2] .... */ | 689 | /* format is: pnp_reserve_irq=irq1[,irq2] .... */ |
| 661 | static int __init pnp_setup_reserve_irq(char *str) | 690 | static int __init pnp_setup_reserve_irq(char *str) |
| 662 | { | 691 | { |
