]> Pileus Git - ~andy/linux/commitdiff
MIPS: pci-ar724x: remove static PCI IO/MEM resources
authorGabor Juhos <juhosg@openwrt.org>
Sun, 3 Feb 2013 09:59:45 +0000 (09:59 +0000)
committerJohn Crispin <blogic@openwrt.org>
Sun, 17 Feb 2013 00:25:39 +0000 (01:25 +0100)
Static resources become impractical when multiple
PCI controllers are present. Move the resources
into the platform device registration code and
change the probe routine to get those from there
platform device's resources.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/4914/
Signed-off-by: John Crispin <blogic@openwrt.org>
arch/mips/ath79/pci.c
arch/mips/pci/pci-ar724x.c

index d90e07136383d49b4523719282916187de0652cf..45d1112de50d40e19cb86c8612578e75a1244bca 100644 (file)
@@ -139,10 +139,13 @@ static struct platform_device *
 ath79_register_pci_ar724x(int id,
                          unsigned long cfg_base,
                          unsigned long ctrl_base,
+                         unsigned long mem_base,
+                         unsigned long mem_size,
+                         unsigned long io_base,
                          int irq)
 {
        struct platform_device *pdev;
-       struct resource res[3];
+       struct resource res[5];
 
        memset(res, 0, sizeof(res));
 
@@ -160,6 +163,16 @@ ath79_register_pci_ar724x(int id,
        res[2].start = irq;
        res[2].end = irq;
 
+       res[3].name = "mem_base";
+       res[3].flags = IORESOURCE_MEM;
+       res[3].start = mem_base;
+       res[3].end = mem_base + mem_size - 1;
+
+       res[4].name = "io_base";
+       res[4].flags = IORESOURCE_IO;
+       res[4].start = io_base;
+       res[4].end = io_base;
+
        pdev = platform_device_register_simple("ar724x-pci", id,
                                               res, ARRAY_SIZE(res));
        return pdev;
@@ -175,6 +188,9 @@ int __init ath79_register_pci(void)
                pdev = ath79_register_pci_ar724x(-1,
                                                 AR724X_PCI_CFG_BASE,
                                                 AR724X_PCI_CTRL_BASE,
+                                                AR724X_PCI_MEM_BASE,
+                                                AR724X_PCI_MEM_SIZE,
+                                                0,
                                                 ATH79_CPU_IRQ_IP2);
        } else if (soc_is_ar9342() ||
                   soc_is_ar9344()) {
@@ -187,6 +203,9 @@ int __init ath79_register_pci(void)
                pdev = ath79_register_pci_ar724x(-1,
                                                 AR724X_PCI_CFG_BASE,
                                                 AR724X_PCI_CTRL_BASE,
+                                                AR724X_PCI_MEM_BASE,
+                                                AR724X_PCI_MEM_SIZE,
+                                                0,
                                                 ATH79_IP2_IRQ(0));
        } else {
                /* No PCI support */
index 93ab8778ce1050a677e1bdb980a0985fb32c358b..d0d707de6c6cf7c6d6dc1287adb44c52160d9e76 100644 (file)
@@ -42,6 +42,8 @@ struct ar724x_pci_controller {
        spinlock_t lock;
 
        struct pci_controller pci_controller;
+       struct resource io_res;
+       struct resource mem_res;
 };
 
 static inline bool ar724x_pci_check_link(struct ar724x_pci_controller *apc)
@@ -190,20 +192,6 @@ static struct pci_ops ar724x_pci_ops = {
        .write  = ar724x_pci_write,
 };
 
-static struct resource ar724x_io_resource = {
-       .name   = "PCI IO space",
-       .start  = 0,
-       .end    = 0,
-       .flags  = IORESOURCE_IO,
-};
-
-static struct resource ar724x_mem_resource = {
-       .name   = "PCI memory space",
-       .start  = AR724X_PCI_MEM_BASE,
-       .end    = AR724X_PCI_MEM_BASE + AR724X_PCI_MEM_SIZE - 1,
-       .flags  = IORESOURCE_MEM,
-};
-
 static void ar724x_pci_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
        struct ar724x_pci_controller *apc;
@@ -331,9 +319,29 @@ static int ar724x_pci_probe(struct platform_device *pdev)
 
        spin_lock_init(&apc->lock);
 
+       res = platform_get_resource_byname(pdev, IORESOURCE_IO, "io_base");
+       if (!res)
+               return -EINVAL;
+
+       apc->io_res.parent = res;
+       apc->io_res.name = "PCI IO space";
+       apc->io_res.start = res->start;
+       apc->io_res.end = res->end;
+       apc->io_res.flags = IORESOURCE_IO;
+
+       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mem_base");
+       if (!res)
+               return -EINVAL;
+
+       apc->mem_res.parent = res;
+       apc->mem_res.name = "PCI memory space";
+       apc->mem_res.start = res->start;
+       apc->mem_res.end = res->end;
+       apc->mem_res.flags = IORESOURCE_MEM;
+
        apc->pci_controller.pci_ops = &ar724x_pci_ops;
-       apc->pci_controller.io_resource = &ar724x_io_resource;
-       apc->pci_controller.mem_resource = &ar724x_mem_resource;
+       apc->pci_controller.io_resource = &apc->io_res;
+       apc->pci_controller.mem_resource = &apc->mem_res;
 
        apc->link_up = ar724x_pci_check_link(apc);
        if (!apc->link_up)