tree fdc53b41cc1c1d762397bf673c43991000a6bdbe
parent 76fa82fb7156aa7191dfd1fdede1fc0da51d45dd
author Dominik Brodowski <[EMAIL PROTECTED]> Sat, 10 Sep 2005 03:03:23 -0700
committer Linus Torvalds <[EMAIL PROTECTED]> Sat, 10 Sep 2005 03:57:47 -0700

[PATCH] yenta: share code with PCI core

Share code between setup-bus.c and yenta_socket.c: use the write-out code of
resources to the bridge also in yenta_socket.c, as it provides useful debug
output.  In addition, it fixes the bug that the CPU-centric resource view
might need to be transferred to the PCI-centric view: setup-bus.c does that,
while yenta-socket.c did not.

Signed-off-by: Dominik Brodowski <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>

 drivers/pci/setup-bus.c       |    4 ++--
 drivers/pcmcia/yenta_socket.c |   41 ++++++++++++++++++-----------------------
 include/linux/pci.h           |    1 +
 3 files changed, 21 insertions(+), 25 deletions(-)

diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -77,8 +77,7 @@ pbus_assign_resources_sorted(struct pci_
        }
 }
 
-static void __devinit
-pci_setup_cardbus(struct pci_bus *bus)
+void pci_setup_cardbus(struct pci_bus *bus)
 {
        struct pci_dev *bridge = bus->self;
        struct pci_bus_region region;
@@ -130,6 +129,7 @@ pci_setup_cardbus(struct pci_bus *bus)
                                        region.end);
        }
 }
+EXPORT_SYMBOL(pci_setup_cardbus);
 
 /* Initialize bridges with base/limit values we have collected.
    PCI-to-PCI Bridge Architecture Specification rev. 1.1 (1998)
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -667,7 +667,7 @@ static int yenta_search_res(struct yenta
        return 0;
 }
 
-static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned 
type, int addr_start, int addr_end)
+static int yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned 
type, int addr_start, int addr_end)
 {
        struct resource *root, *res;
        struct pci_bus_region region;
@@ -676,7 +676,7 @@ static void yenta_allocate_res(struct ye
        res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
        /* Already allocated? */
        if (res->parent)
-               return;
+               return 0;
 
        /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
        mask = ~0xfff;
@@ -692,7 +692,7 @@ static void yenta_allocate_res(struct ye
                pcibios_bus_to_resource(socket->dev, res, &region);
                root = pci_find_parent_resource(socket->dev, res);
                if (root && (request_resource(root, res) == 0))
-                       return;
+                       return 0;
                printk(KERN_INFO "yenta %s: Preassigned resource %d busy or not 
available, reconfiguring...\n",
                                pci_name(socket->dev), nr);
        }
@@ -700,35 +700,27 @@ static void yenta_allocate_res(struct ye
        if (type & IORESOURCE_IO) {
                if ((yenta_search_res(socket, res, BRIDGE_IO_MAX)) ||
                    (yenta_search_res(socket, res, BRIDGE_IO_ACC)) ||
-                   (yenta_search_res(socket, res, BRIDGE_IO_MIN))) {
-                       config_writel(socket, addr_start, res->start);
-                       config_writel(socket, addr_end, res->end);
-                       return;
-               }
+                   (yenta_search_res(socket, res, BRIDGE_IO_MIN)))
+                       return 1;
        } else {
                if (type & IORESOURCE_PREFETCH) {
                        if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) ||
                            (yenta_search_res(socket, res, BRIDGE_MEM_ACC)) ||
-                           (yenta_search_res(socket, res, BRIDGE_MEM_MIN))) {
-                               config_writel(socket, addr_start, res->start);
-                               config_writel(socket, addr_end, res->end);
-                               return;
-                       }
+                           (yenta_search_res(socket, res, BRIDGE_MEM_MIN)))
+                               return 1;
                        /* Approximating prefetchable by non-prefetchable */
                        res->flags = IORESOURCE_MEM;
                }
                if ((yenta_search_res(socket, res, BRIDGE_MEM_MAX)) ||
                    (yenta_search_res(socket, res, BRIDGE_MEM_ACC)) ||
-                   (yenta_search_res(socket, res, BRIDGE_MEM_MIN))) {
-                       config_writel(socket, addr_start, res->start);
-                       config_writel(socket, addr_end, res->end);
-                       return;
-               }
+                   (yenta_search_res(socket, res, BRIDGE_MEM_MIN)))
+                       return 1;
        }
 
        printk(KERN_INFO "yenta %s: no resource of type %x available, trying to 
continue...\n",
               pci_name(socket->dev), type);
        res->start = res->end = res->flags = 0;
+       return 0;
 }
 
 /*
@@ -736,14 +728,17 @@ static void yenta_allocate_res(struct ye
  */
 static void yenta_allocate_resources(struct yenta_socket *socket)
 {
-       yenta_allocate_res(socket, 0, IORESOURCE_IO,
+       int program = 0;
+       program += yenta_allocate_res(socket, 0, IORESOURCE_IO,
                           PCI_CB_IO_BASE_0, PCI_CB_IO_LIMIT_0);
-       yenta_allocate_res(socket, 1, IORESOURCE_IO,
+       program += yenta_allocate_res(socket, 1, IORESOURCE_IO,
                           PCI_CB_IO_BASE_1, PCI_CB_IO_LIMIT_1);
-       yenta_allocate_res(socket, 2, IORESOURCE_MEM|IORESOURCE_PREFETCH,
+       program += yenta_allocate_res(socket, 2, 
IORESOURCE_MEM|IORESOURCE_PREFETCH,
                           PCI_CB_MEMORY_BASE_0, PCI_CB_MEMORY_LIMIT_0);
-       yenta_allocate_res(socket, 3, IORESOURCE_MEM,
+       program += yenta_allocate_res(socket, 3, IORESOURCE_MEM,
                           PCI_CB_MEMORY_BASE_1, PCI_CB_MEMORY_LIMIT_1);
+       if (program)
+               pci_setup_cardbus(socket->dev->subordinate);
 }
 
 
@@ -758,7 +753,7 @@ static void yenta_free_resources(struct 
                res = socket->dev->resource + PCI_BRIDGE_RESOURCES + i;
                if (res->start != 0 && res->end != 0)
                        release_resource(res);
-               res->start = res->end = 0;
+               res->start = res->end = res->flags = 0;
        }
 }
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -326,6 +326,7 @@ extern struct pci_dev *pci_dev_get(struc
 extern void pci_dev_put(struct pci_dev *dev);
 extern void pci_remove_bus(struct pci_bus *b);
 extern void pci_remove_bus_device(struct pci_dev *dev);
+void pci_setup_cardbus(struct pci_bus *bus);
 
 /* Generic PCI functions exported to card drivers */
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to