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

PNP: make generic pnp_add_dma_resource()

Add a pnp_add_dma_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
dc16f5f2 dbddd038

+47 -72
+2
drivers/pnp/base.h
··· 43 43 44 44 struct pnp_resource *pnp_add_irq_resource(struct pnp_dev *dev, int irq, 45 45 int flags); 46 + struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma, 47 + int flags);
+4 -10
drivers/pnp/interface.c
··· 440 440 buf += 3; 441 441 while (isspace(*buf)) 442 442 ++buf; 443 - pnp_res = pnp_get_pnp_resource(dev, 444 - IORESOURCE_DMA, ndma); 445 - if (!pnp_res) 446 - break; 447 - pnp_res->index = ndma; 448 - res = &pnp_res->res; 449 - res->start = res->end = 450 - simple_strtoul(buf, &buf, 0); 451 - res->flags = IORESOURCE_DMA; 452 - ndma++; 443 + start = simple_strtoul(buf, &buf, 0); 444 + pnp_res = pnp_add_dma_resource(dev, start, 0); 445 + if (pnp_res) 446 + pnp_res->index = ndma++; 453 447 continue; 454 448 } 455 449 break;
+3 -6
drivers/pnp/isapnp/core.c
··· 973 973 ret = isapnp_read_byte(ISAPNP_CFG_DMA + tmp); 974 974 if (ret == 4) 975 975 continue; 976 - pnp_res = pnp_get_pnp_resource(dev, IORESOURCE_DMA, 977 - tmp); 978 - pnp_res->index = tmp; 979 - res = &pnp_res->res; 980 - res->start = res->end = ret; 981 - res->flags = IORESOURCE_DMA; 976 + pnp_res = pnp_add_dma_resource(dev, ret, 0); 977 + if (pnp_res) 978 + pnp_res->index = tmp; 982 979 } 983 980 } 984 981 return 0;
+8 -34
drivers/pnp/pnpacpi/rsparser.c
··· 158 158 return flags; 159 159 } 160 160 161 - static void pnpacpi_parse_allocated_dmaresource(struct pnp_dev *dev, 162 - u32 dma, int flags) 163 - { 164 - struct resource *res; 165 - int i; 166 - static unsigned char warned; 167 - 168 - for (i = 0; i < PNP_MAX_DMA; i++) { 169 - res = pnp_get_resource(dev, IORESOURCE_DMA, i); 170 - if (!pnp_resource_valid(res)) 171 - break; 172 - } 173 - if (i < PNP_MAX_DMA) { 174 - res->flags = IORESOURCE_DMA; // Also clears _UNSET flag 175 - res->flags |= flags; 176 - if (dma == -1) { 177 - res->flags |= IORESOURCE_DISABLED; 178 - return; 179 - } 180 - res->start = dma; 181 - res->end = dma; 182 - } else if (!warned) { 183 - printk(KERN_WARNING "pnpacpi: exceeded the max number of DMA " 184 - "resources: %d \n", PNP_MAX_DMA); 185 - warned = 1; 186 - } 187 - } 188 - 189 161 static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, 190 162 u64 io, u64 len, int io_decode) 191 163 { ··· 257 285 struct acpi_resource_memory32 *memory32; 258 286 struct acpi_resource_fixed_memory32 *fixed_memory32; 259 287 struct acpi_resource_extended_irq *extended_irq; 260 - int i; 288 + int i, flags; 261 289 262 290 switch (res->type) { 263 291 case ACPI_RESOURCE_TYPE_IRQ: ··· 277 305 278 306 case ACPI_RESOURCE_TYPE_DMA: 279 307 dma = &res->data.dma; 280 - if (dma->channel_count > 0) 281 - pnpacpi_parse_allocated_dmaresource(dev, 282 - dma->channels[0], 283 - dma_flags(dma->type, dma->bus_master, 284 - dma->transfer)); 308 + if (dma->channel_count > 0) { 309 + flags = dma_flags(dma->type, dma->bus_master, 310 + dma->transfer); 311 + if (dma->channels[0] == (u8) -1) 312 + flags |= IORESOURCE_DISABLED; 313 + pnp_add_dma_resource(dev, dma->channels[0], flags); 314 + } 285 315 break; 286 316 287 317 case ACPI_RESOURCE_TYPE_IO:
+4 -22
drivers/pnp/pnpbios/rsparser.c
··· 54 54 * Allocated Resources 55 55 */ 56 56 57 - static void pnpbios_parse_allocated_dmaresource(struct pnp_dev *dev, int dma) 58 - { 59 - struct resource *res; 60 - int i; 61 - 62 - for (i = 0; i < PNP_MAX_DMA; i++) { 63 - res = pnp_get_resource(dev, IORESOURCE_DMA, i); 64 - if (!pnp_resource_valid(res)) 65 - break; 66 - } 67 - 68 - if (i < PNP_MAX_DMA) { 69 - res->flags = IORESOURCE_DMA; // Also clears _UNSET flag 70 - if (dma == -1) { 71 - res->flags |= IORESOURCE_DISABLED; 72 - return; 73 - } 74 - res->start = res->end = (unsigned long)dma; 75 - } 76 - } 77 - 78 57 static void pnpbios_parse_allocated_ioresource(struct pnp_dev *dev, 79 58 int io, int len) 80 59 { ··· 178 199 case SMALL_TAG_DMA: 179 200 if (len != 2) 180 201 goto len_err; 202 + flags = 0; 181 203 io = -1; 182 204 mask = p[1]; 183 205 for (i = 0; i < 8; i++, mask = mask >> 1) 184 206 if (mask & 0x01) 185 207 io = i; 186 - pnpbios_parse_allocated_dmaresource(dev, io); 208 + if (io == -1) 209 + flags = IORESOURCE_DISABLED; 210 + pnp_add_dma_resource(dev, io, flags); 187 211 break; 188 212 189 213 case SMALL_TAG_PORT:
+26
drivers/pnp/resource.c
··· 602 602 return pnp_res; 603 603 } 604 604 605 + struct pnp_resource *pnp_add_dma_resource(struct pnp_dev *dev, int dma, 606 + int flags) 607 + { 608 + struct pnp_resource *pnp_res; 609 + struct resource *res; 610 + static unsigned char warned; 611 + 612 + pnp_res = pnp_new_resource(dev, IORESOURCE_DMA); 613 + if (!pnp_res) { 614 + if (!warned) { 615 + dev_err(&dev->dev, "can't add resource for DMA %d\n", 616 + dma); 617 + warned = 1; 618 + } 619 + return NULL; 620 + } 621 + 622 + res = &pnp_res->res; 623 + res->flags = IORESOURCE_DMA | flags; 624 + res->start = dma; 625 + res->end = dma; 626 + 627 + dev_dbg(&dev->dev, " add dma %d flags %#x\n", dma, flags); 628 + return pnp_res; 629 + } 630 + 605 631 /* format is: pnp_reserve_irq=irq1[,irq2] .... */ 606 632 static int __init pnp_setup_reserve_irq(char *str) 607 633 {