resource/PCI: align functions now return start of resource
authorDominik Brodowski <linux@dominikbrodowski.net>
Fri, 1 Jan 2010 16:40:49 +0000 (17:40 +0100)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Tue, 23 Feb 2010 00:16:56 +0000 (16:16 -0800)
As suggested by Linus, align functions should return the start
of a resource, not void. An update of "res->start" is no longer
necessary.

Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
21 files changed:
arch/alpha/kernel/pci.c
arch/arm/kernel/bios32.c
arch/cris/arch-v32/drivers/pci/bios.c
arch/frv/mb93090-mb00/pci-frv.c
arch/ia64/pci/pci.c
arch/mips/pci/pci.c
arch/mips/pmc-sierra/yosemite/ht.c
arch/mn10300/unit-asb2305/pci-asb2305.c
arch/parisc/kernel/pci.c
arch/powerpc/kernel/pci-common.c
arch/sh/drivers/pci/pci.c
arch/sparc/kernel/pci.c
arch/sparc/kernel/pcic.c
arch/x86/pci/i386.c
arch/xtensa/kernel/pci.c
drivers/pci/bus.c
drivers/pcmcia/rsrc_mgr.c
drivers/pcmcia/rsrc_nonstatic.c
include/linux/ioport.h
include/linux/pci.h
kernel/resource.c

index a91ba28999b57a03d34036f105fd1070fa8fe2d3..5cf111ed851cb4e36b7524bd2035ed21fbdb5105 100644 (file)
@@ -126,7 +126,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final);
 #define MB                     (1024*KB)
 #define GB                     (1024*MB)
 
-void
+resource_size_t
 pcibios_align_resource(void *data, struct resource *res,
                       resource_size_t size, resource_size_t align)
 {
@@ -184,7 +184,7 @@ pcibios_align_resource(void *data, struct resource *res,
                }
        }
 
-       res->start = start;
+       return start;
 }
 #undef KB
 #undef MB
index 809681900ec8705ee6d524707ffd251c31e12a4f..a7c85f84f06cbddb50243154fc6a8ce214c15e1f 100644 (file)
@@ -616,15 +616,17 @@ char * __init pcibios_setup(char *str)
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might be mirrored at 0x0100-0x03ff..
  */
-void pcibios_align_resource(void *data, struct resource *res,
-                           resource_size_t size, resource_size_t align)
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
        resource_size_t start = res->start;
 
        if (res->flags & IORESOURCE_IO && start & 0x300)
                start = (start + 0x3ff) & ~0x3ff;
 
-       res->start = (start + align - 1) & ~(align - 1);
+       start = (start + align - 1) & ~(align - 1);
+
+       return start;
 }
 
 /**
index 77ee319193c32a1d9e4a4287b13e4e28d6506a7e..5811e2f8945c852e11066d3f3d962da35f7f8904 100644 (file)
@@ -41,18 +41,16 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
        return 0;
 }
 
-void
+resource_size_t
 pcibios_align_resource(void *data, struct resource *res,
                       resource_size_t size, resource_size_t align)
 {
-       if (res->flags & IORESOURCE_IO) {
-               resource_size_t start = res->start;
+       resource_size_t start = res->start;
 
-               if (start & 0x300) {
-                       start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
-               }
-       }
+       if ((res->flags & IORESOURCE_IO) && (start & 0x300))
+               start = (start + 0x3ff) & ~0x3ff;
+
+       return start
 }
 
 int pcibios_enable_resources(struct pci_dev *dev, int mask)
index 566bdeb499d14e1c1a0a574505a8a887e541da9c..c947aa43f2a93080d3056ae618445e1796d95c91 100644 (file)
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might have be mirrored at 0x0100-0x03ff..
  */
-void
+resource_size_t
 pcibios_align_resource(void *data, struct resource *res,
                       resource_size_t size, resource_size_t align)
 {
-       if (res->flags & IORESOURCE_IO) {
-               resource_size_t start = res->start;
+       resource_size_t start = res->start;
 
-               if (start & 0x300) {
-                       start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
-               }
-       }
+       if ((res->flags & IORESOURCE_IO) && (start & 0x300))
+               start = (start + 0x3ff) & ~0x3ff;
+
+       return start
 }
 
 
index df639db779f95192a71d93d5895113080b1bf41a..ef574cd311d1a89155ed9ef1442901119967ae95 100644 (file)
@@ -547,10 +547,11 @@ pcibios_disable_device (struct pci_dev *dev)
                acpi_pci_irq_disable(dev);
 }
 
-void
+resource_size_t
 pcibios_align_resource (void *data, struct resource *res,
                        resource_size_t size, resource_size_t align)
 {
+       return res->start;
 }
 
 /*
index 9a11c22268914ab6ea87823e6e2a3667d54237e4..9085988f7cf3d9d2a24720baed469a9b1dd25382 100644 (file)
@@ -49,7 +49,7 @@ static int pci_initialized;
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might have be mirrored at 0x0100-0x03ff..
  */
-void
+resource_size_t
 pcibios_align_resource(void *data, struct resource *res,
                       resource_size_t size, resource_size_t align)
 {
@@ -73,7 +73,7 @@ pcibios_align_resource(void *data, struct resource *res,
                        start = PCIBIOS_MIN_MEM + hose->mem_resource->start;
        }
 
-       res->start = start;
+       return start;
 }
 
 static void __devinit pcibios_scanbus(struct pci_controller *hose)
index 678388fd34b1a9e521d812c307a0aec42478fbc4..5e410087b6284e1dc684d88aba0f56e3c80f6383 100644 (file)
@@ -345,14 +345,13 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
         return pcibios_enable_resources(dev);
 }
 
-void pcibios_align_resource(void *data, struct resource *res,
-                            resource_size_t size, resource_size_t align)
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
         struct pci_dev *dev = data;
+       resource_size_t start = res->start;
 
         if (res->flags & IORESOURCE_IO) {
-                resource_size_t start = res->start;
-
                 /* We need to avoid collisions with `mirrored' VGA ports
                    and other strange ISA hardware, so we always want the
                    addresses kilobyte aligned.  */
@@ -363,8 +362,9 @@ void pcibios_align_resource(void *data, struct resource *res,
                 }
 
                 start = (start + 1024 - 1) & ~(1024 - 1);
-                res->start = start;
         }
+
+       return start;
 }
 
 struct pci_ops titan_pci_ops = {
index 78cd134ddf7dc19f5c51b4ebd5ce48f8c9d01847..b0b3758fba082bc1381333d41dde539d9ef36b6b 100644 (file)
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might have be mirrored at 0x0100-0x03ff..
  */
-void pcibios_align_resource(void *data, struct resource *res,
-                           resource_size_t size, resource_size_t align)
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
+       resource_size_t start = res->start;
+
 #if 0
        struct pci_dev *dev = data;
 
@@ -47,14 +49,10 @@ void pcibios_align_resource(void *data, struct resource *res,
               );
 #endif
 
-       if (res->flags & IORESOURCE_IO) {
-               unsigned long start = res->start;
+       if ((res->flags & IORESOURCE_IO) && (start & 0x300))
+               start = (start + 0x3ff) & ~0x3ff;
 
-               if (start & 0x300) {
-                       start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
-               }
-       }
+       return start;
 }
 
 
index f7064abc3bb6e60a544e3bfb97c12f468768fd89..4463a31973ba4067f0242c9c14f961a356089c6a 100644 (file)
@@ -254,10 +254,10 @@ EXPORT_SYMBOL(pcibios_bus_to_resource);
  * Since we are just checking candidates, don't use any fields other
  * than res->start.
  */
-void pcibios_align_resource(void *data, struct resource *res,
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
                                resource_size_t size, resource_size_t alignment)
 {
-       resource_size_t mask, align;
+       resource_size_t mask, align, start = res->start;
 
        DBG_RES("pcibios_align_resource(%s, (%p) [%lx,%lx]/%x, 0x%lx, 0x%lx)\n",
                pci_name(((struct pci_dev *) data)),
@@ -269,10 +269,10 @@ void pcibios_align_resource(void *data, struct resource *res,
 
        /* Align to largest of MIN or input size */
        mask = max(alignment, align) - 1;
-       res->start += mask;
-       res->start &= ~mask;
+       start += mask;
+       start &= ~mask;
 
-       /* The caller updates the end field, we don't.  */
+       return start;
 }
 
 
index cadbed679fbbc17cc8cac85426a50c6cc631db34..d7eebbaf01f12ce530d7791bc79b66081fc3be73 100644 (file)
@@ -1181,21 +1181,20 @@ static int skip_isa_ioresource_align(struct pci_dev *dev)
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might have be mirrored at 0x0100-0x03ff..
  */
-void pcibios_align_resource(void *data, struct resource *res,
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
                                resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
+       resource_size_t start = res->start;
 
        if (res->flags & IORESOURCE_IO) {
-               resource_size_t start = res->start;
-
                if (skip_isa_ioresource_align(dev))
-                       return;
-               if (start & 0x300) {
+                       return start;
+               if (start & 0x300)
                        start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
-               }
        }
+
+       return start;
 }
 EXPORT_SYMBOL(pcibios_align_resource);
 
index c481df6390223c7d1a50469ee4c2b1f03c15f780..b36ca825b3d35adf9ef85f74f172da351b644d6f 100644 (file)
@@ -148,8 +148,8 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
  * addresses to be allocated in the 0x000-0x0ff region
  * modulo 0x400.
  */
-void pcibios_align_resource(void *data, struct resource *res,
-                           resource_size_t size, resource_size_t align)
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
        struct pci_channel *chan = dev->sysdata;
@@ -171,7 +171,7 @@ void pcibios_align_resource(void *data, struct resource *res,
                        start = PCIBIOS_MIN_MEM + chan->mem_resource->start;
        }
 
-       res->start = start;
+       return start;
 }
 
 void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
index 592b03d85167231656812bb3e3df6a9dba462285..d56c1f34689ec7314b251ddb8202029647aa3e42 100644 (file)
@@ -722,9 +722,10 @@ void pcibios_update_irq(struct pci_dev *pdev, int irq)
 {
 }
 
-void pcibios_align_resource(void *data, struct resource *res,
-                           resource_size_t size, resource_size_t align)
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
+       return res->start;
 }
 
 int pcibios_enable_device(struct pci_dev *dev, int mask)
index 4e2724ec2bb6d6c3e660cf06feb7c62b1953fed1..46fda64ff16359212f8e4aa0de5c60e5b8ff0266 100644 (file)
@@ -768,9 +768,10 @@ char * __devinit pcibios_setup(char *str)
        return str;
 }
 
-void pcibios_align_resource(void *data, struct resource *res,
-                           resource_size_t size, resource_size_t align)
+resource_size_t pcibios_align_resource(void *data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
+       return res->start;
 }
 
 int pcibios_enable_device(struct pci_dev *pdev, int mask)
index 5dc9e8c63fcdedb26a096d48efcf2392cd8f8209..924e40c916d3d2676de409db1aabb07e33a7699e 100644 (file)
@@ -60,22 +60,20 @@ skip_isa_ioresource_align(struct pci_dev *dev) {
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might have be mirrored at 0x0100-0x03ff..
  */
-void
+resource_size_t
 pcibios_align_resource(void *data, struct resource *res,
                        resource_size_t size, resource_size_t align)
 {
        struct pci_dev *dev = data;
+       resource_size_t start = res->start;
 
        if (res->flags & IORESOURCE_IO) {
-               resource_size_t start = res->start;
-
                if (skip_isa_ioresource_align(dev))
-                       return;
-               if (start & 0x300) {
+                       return start;
+               if (start & 0x300)
                        start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
-               }
        }
+       return start;
 }
 EXPORT_SYMBOL(pcibios_align_resource);
 
index b7c073484e016d0ea2749c0cb81b3c2cdfbd2d73..d7efab03164e6320a3dd8971a3582bd293ba752c 100644 (file)
@@ -69,26 +69,25 @@ static int pci_bus_count;
  * but we want to try to avoid allocating at 0x2900-0x2bff
  * which might have be mirrored at 0x0100-0x03ff..
  */
-void
+resource_size_t
 pcibios_align_resource(void *data, struct resource *res, resource_size_t size,
                       resource_size_t align)
 {
        struct pci_dev *dev = data;
+       resource_size_t start = res->start;
 
        if (res->flags & IORESOURCE_IO) {
-               resource_size_t start = res->start;
-
                if (size > 0x100) {
                        printk(KERN_ERR "PCI: I/O Region %s/%d too large"
                               " (%ld bytes)\n", pci_name(dev),
                               dev->resource - res, size);
                }
 
-               if (start & 0x300) {
+               if (start & 0x300)
                        start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
-               }
        }
+
+       return start;
 }
 
 int
index cef28a79103f06e9178b9c86419c641cad3b74af..d29d69a37940a5a72393dbe1cfc239cfc905fe50 100644 (file)
@@ -36,8 +36,10 @@ int
 pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
                resource_size_t size, resource_size_t align,
                resource_size_t min, unsigned int type_mask,
-               void (*alignf)(void *, struct resource *, resource_size_t,
-                               resource_size_t),
+               resource_size_t (*alignf)(void *,
+                                         struct resource *,
+                                         resource_size_t,
+                                         resource_size_t),
                void *alignf_data)
 {
        int i, ret = -ENOMEM;
index 52db17263d8bd9b0b7265040c0a3747ccc7be601..f92a2dac13a2d44998e3b99d35896ad2efa3a4a8 100644 (file)
@@ -114,22 +114,20 @@ struct pcmcia_align_data {
        unsigned long   offset;
 };
 
-static void pcmcia_align(void *align_data, struct resource *res,
-                       unsigned long size, unsigned long align)
+static resource_size_t pcmcia_align(void *align_data, struct resource *res,
+                               resource_size_t size, resource_size_t align)
 {
        struct pcmcia_align_data *data = align_data;
-       unsigned long start;
+       resource_size_t start;
 
        start = (res->start & ~data->mask) + data->offset;
        if (start < res->start)
                start += data->mask + 1;
-       res->start = start;
 
 #ifdef CONFIG_X86
        if (res->flags & IORESOURCE_IO) {
                if (start & 0x300) {
                        start = (start + 0x3ff) & ~0x3ff;
-                       res->start = start;
                }
        }
 #endif
@@ -137,9 +135,11 @@ static void pcmcia_align(void *align_data, struct resource *res,
 #ifdef CONFIG_M68K
        if (res->flags & IORESOURCE_IO) {
                if ((res->start + size - 1) >= 1024)
-                       res->start = res->end;
+                       start = res->end;
        }
 #endif
+
+       return start;
 }
 
 
index 9b0dc433a8c3a6953f223dd6160adbdc22db5b20..b65902870e449a39fcce48b5c89a3653d02c08de 100644 (file)
@@ -533,7 +533,7 @@ struct pcmcia_align_data {
        struct resource_map     *map;
 };
 
-static void
+static resource_size_t
 pcmcia_common_align(void *align_data, struct resource *res,
                        resource_size_t size, resource_size_t align)
 {
@@ -545,17 +545,18 @@ pcmcia_common_align(void *align_data, struct resource *res,
        start = (res->start & ~data->mask) + data->offset;
        if (start < res->start)
                start += data->mask + 1;
-       res->start = start;
+       return start;
 }
 
-static void
+static resource_size_t
 pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
                resource_size_t align)
 {
        struct pcmcia_align_data *data = align_data;
        struct resource_map *m;
+       resource_size_t start;
 
-       pcmcia_common_align(data, res, size, align);
+       start = pcmcia_common_align(data, res, size, align);
 
        for (m = data->map->next; m != data->map; m = m->next) {
                unsigned long start = m->base;
@@ -567,8 +568,7 @@ pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
                 * fit here.
                 */
                if (res->start < start) {
-                       res->start = start;
-                       pcmcia_common_align(data, res, size, align);
+                       start = pcmcia_common_align(data, res, size, align);
                }
 
                /*
@@ -586,7 +586,9 @@ pcmcia_align(void *align_data, struct resource *res, resource_size_t size,
         * If we failed to find something suitable, ensure we fail.
         */
        if (m == data->map)
-               res->start = res->end;
+               start = res->end;
+
+       return start;
 }
 
 /*
index 7129504e053d29c722706990059c77596f3e7c2d..f4195de4eb9dd1468b4af45bf00d3d38f6d061a5 100644 (file)
@@ -120,8 +120,10 @@ extern void insert_resource_expand_to_fit(struct resource *root, struct resource
 extern int allocate_resource(struct resource *root, struct resource *new,
                             resource_size_t size, resource_size_t min,
                             resource_size_t max, resource_size_t align,
-                            void (*alignf)(void *, struct resource *,
-                                           resource_size_t, resource_size_t),
+                            resource_size_t (*alignf)(void *,
+                                                      struct resource *,
+                                                      resource_size_t,
+                                                      resource_size_t),
                             void *alignf_data);
 int adjust_resource(struct resource *res, resource_size_t start,
                    resource_size_t size);
index 16f48e7506ed11d38a96e5979c7894231183c1a6..1bd9f52b24b89bf76625f7696fbf154beaa57c90 100644 (file)
@@ -592,7 +592,8 @@ int __must_check pcibios_enable_device(struct pci_dev *, int mask);
 char *pcibios_setup(char *str);
 
 /* Used only when drivers/pci/setup.c is used */
-void pcibios_align_resource(void *, struct resource *, resource_size_t,
+resource_size_t pcibios_align_resource(void *, struct resource *,
+                               resource_size_t,
                                resource_size_t);
 void pcibios_update_irq(struct pci_dev *, int irq);
 
@@ -827,8 +828,9 @@ int __must_check pci_bus_alloc_resource(struct pci_bus *bus,
                        struct resource *res, resource_size_t size,
                        resource_size_t align, resource_size_t min,
                        unsigned int type_mask,
-                       void (*alignf)(void *, struct resource *,
-                               resource_size_t, resource_size_t),
+                       resource_size_t (*alignf)(void *, struct resource *,
+                                                 resource_size_t,
+                                                 resource_size_t),
                        void *alignf_data);
 void pci_enable_bridges(struct pci_bus *bus);
 
index af96c1e4b54b11b27fe445b834e3106b5b76b472..e697f20e22882df13ed09e0ea2cef372fed985bc 100644 (file)
@@ -303,8 +303,10 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
 static int find_resource(struct resource *root, struct resource *new,
                         resource_size_t size, resource_size_t min,
                         resource_size_t max, resource_size_t align,
-                        void (*alignf)(void *, struct resource *,
-                                       resource_size_t, resource_size_t),
+                        resource_size_t (*alignf)(void *,
+                                                  struct resource *,
+                                                  resource_size_t,
+                                                  resource_size_t),
                         void *alignf_data)
 {
        struct resource *this = root->child;
@@ -330,7 +332,7 @@ static int find_resource(struct resource *root, struct resource *new,
                        tmp.end = max;
                tmp.start = ALIGN(tmp.start, align);
                if (alignf)
-                       alignf(alignf_data, &tmp, size, align);
+                       tmp.start = alignf(alignf_data, &tmp, size, align);
                if (tmp.start < tmp.end && tmp.end - tmp.start >= size - 1) {
                        new->start = tmp.start;
                        new->end = tmp.start + size - 1;
@@ -358,8 +360,10 @@ static int find_resource(struct resource *root, struct resource *new,
 int allocate_resource(struct resource *root, struct resource *new,
                      resource_size_t size, resource_size_t min,
                      resource_size_t max, resource_size_t align,
-                     void (*alignf)(void *, struct resource *,
-                                    resource_size_t, resource_size_t),
+                     resource_size_t (*alignf)(void *,
+                                               struct resource *,
+                                               resource_size_t,
+                                               resource_size_t),
                      void *alignf_data)
 {
        int err;