bcm53xx: group iProc patches into patchsets they were sent in
authorRafał Miłecki <zajec5@gmail.com>
Tue, 19 Jan 2016 20:58:48 +0000 (20:58 +0000)
committerRafał Miłecki <zajec5@gmail.com>
Tue, 19 Jan 2016 20:58:48 +0000 (20:58 +0000)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
SVN-Revision: 48368

14 files changed:
target/linux/bcm53xx/patches-4.1/030-0001-PCI-iproc-Allow-override-of-device-tree-IRQ-mapping-.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/030-0002-PCI-iproc-Add-BCMA-PCIe-driver.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/030-PCI-iproc-Allow-override-of-device-tree-IRQ-mapping-.patch [deleted file]
target/linux/bcm53xx/patches-4.1/031-0001-PCI-iproc-Directly-add-PCI-resources.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/031-0002-PCI-iproc-Free-resource-list-after-registration.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/031-PCI-iproc-Add-BCMA-PCIe-driver.patch [deleted file]
target/linux/bcm53xx/patches-4.1/032-PCI-iproc-Delete-unnecessary-checks-before-phy-calls.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/032-PCI-iproc-Directly-add-PCI-resources.patch [deleted file]
target/linux/bcm53xx/patches-4.1/033-0001-PCI-iproc-enable-arm64-support-for-iProc-PCIe.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/033-0002-PCI-iproc-Fix-ARM64-dependency-in-Kconfig.patch [new file with mode: 0644]
target/linux/bcm53xx/patches-4.1/033-PCI-iproc-Free-resource-list-after-registration.patch [deleted file]
target/linux/bcm53xx/patches-4.1/035-PCI-iproc-Delete-unnecessary-checks-before-phy-calls.patch [deleted file]
target/linux/bcm53xx/patches-4.1/037-PCI-iproc-enable-arm64-support-for-iProc-PCIe.patch [deleted file]
target/linux/bcm53xx/patches-4.1/038-PCI-iproc-Fix-ARM64-dependency-in-Kconfig.patch [deleted file]

diff --git a/target/linux/bcm53xx/patches-4.1/030-0001-PCI-iproc-Allow-override-of-device-tree-IRQ-mapping-.patch b/target/linux/bcm53xx/patches-4.1/030-0001-PCI-iproc-Allow-override-of-device-tree-IRQ-mapping-.patch
new file mode 100644 (file)
index 0000000..9050f72
--- /dev/null
@@ -0,0 +1,53 @@
+From c1e02ceaf5739d32f092ac07bf886a0281ec40b1 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Tue, 12 May 2015 23:23:00 +0200
+Subject: [PATCH 1/2] PCI: iproc: Allow override of device tree IRQ mapping
+ function
+
+The iProc core PCIe driver defaults to using of_irq_parse_and_map_pci() for
+IRQ mapping.  Add iproc_pcie.map_irq so bus interfaces that don't use
+device tree can override this by supplying their own IRQ mapping function.
+
+[bhelgaas: changelog]
+Posting: http://lkml.kernel.org/r/1431465781-10753-1-git-send-email-hauke@hauke-m.de
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Ray Jui <rjui@broadcom.com.com>
+---
+ drivers/pci/host/pcie-iproc-platform.c | 2 ++
+ drivers/pci/host/pcie-iproc.c          | 2 +-
+ drivers/pci/host/pcie-iproc.h          | 1 +
+ 3 files changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/pci/host/pcie-iproc-platform.c
++++ b/drivers/pci/host/pcie-iproc-platform.c
+@@ -71,6 +71,8 @@ static int iproc_pcie_pltfm_probe(struct
+       pcie->resources = &res;
++      pcie->map_irq = of_irq_parse_and_map_pci;
++
+       ret = iproc_pcie_setup(pcie);
+       if (ret) {
+               dev_err(pcie->dev, "PCIe controller setup failed\n");
+--- a/drivers/pci/host/pcie-iproc.c
++++ b/drivers/pci/host/pcie-iproc.c
+@@ -229,7 +229,7 @@ int iproc_pcie_setup(struct iproc_pcie *
+       pci_scan_child_bus(bus);
+       pci_assign_unassigned_bus_resources(bus);
+-      pci_fixup_irqs(pci_common_swizzle, of_irq_parse_and_map_pci);
++      pci_fixup_irqs(pci_common_swizzle, pcie->map_irq);
+       pci_bus_add_devices(bus);
+       return 0;
+--- a/drivers/pci/host/pcie-iproc.h
++++ b/drivers/pci/host/pcie-iproc.h
+@@ -34,6 +34,7 @@ struct iproc_pcie {
+       struct pci_bus *root_bus;
+       struct phy *phy;
+       int irqs[IPROC_PCIE_MAX_NUM_IRQS];
++      int (*map_irq)(const struct pci_dev *, u8, u8);
+ };
+ int iproc_pcie_setup(struct iproc_pcie *pcie);
diff --git a/target/linux/bcm53xx/patches-4.1/030-0002-PCI-iproc-Add-BCMA-PCIe-driver.patch b/target/linux/bcm53xx/patches-4.1/030-0002-PCI-iproc-Add-BCMA-PCIe-driver.patch
new file mode 100644 (file)
index 0000000..a850baf
--- /dev/null
@@ -0,0 +1,177 @@
+From 4785ffbdc9b52e308e43b9e2dcc1dca44f056d76 Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Tue, 12 May 2015 23:23:01 +0200
+Subject: [PATCH 2/2] PCI: iproc: Add BCMA PCIe driver
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This driver adds support for the PCIe 2.0 controller found on the BCMA bus.
+This controller can be found on (mostly) all Broadcom BCM470X / BCM5301X
+ARM SoCs.
+
+The driver found in the Broadcom SDK does some more stuff, like setting up
+some DMA memory areas, chaining MPS and MRRS to 512 and also some PHY
+changes like "improving" the PCIe jitter and doing some special
+initialization for the 3rd PCIe port.
+
+This was tested on a bcm4708 board with 2 PCIe ports and wireless cards
+connected to them.
+
+PCI_DOMAINS is needed by this driver, because normally there is more than
+one PCIe controller and without PCI_DOMAINS only the first controller gets
+registered.  This controller gets 6 IRQs; the last one is trigged by all
+IRQ events.
+
+[bhelgaas: fix "GPLv2" MODULE_LICENSE typo]
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Acked-by: Rafał Miłecki <zajec5@gmail.com>
+Acked-by: Ray Jui <rjui@broadcom.com.com>
+---
+ drivers/pci/host/Kconfig           |  11 ++++
+ drivers/pci/host/Makefile          |   1 +
+ drivers/pci/host/pcie-iproc-bcma.c | 112 +++++++++++++++++++++++++++++++++++++
+ 3 files changed, 124 insertions(+)
+ create mode 100644 drivers/pci/host/pcie-iproc-bcma.c
+
+--- a/drivers/pci/host/Kconfig
++++ b/drivers/pci/host/Kconfig
+@@ -125,4 +125,15 @@ config PCIE_IPROC_PLATFORM
+         Say Y here if you want to use the Broadcom iProc PCIe controller
+         through the generic platform bus interface
++config PCIE_IPROC_BCMA
++      bool "Broadcom iProc PCIe BCMA bus driver"
++      depends on ARCH_BCM_IPROC || (ARM && COMPILE_TEST)
++      select PCIE_IPROC
++      select BCMA
++      select PCI_DOMAINS
++      default ARCH_BCM_5301X
++      help
++        Say Y here if you want to use the Broadcom iProc PCIe controller
++        through the BCMA bus interface
++
+ endmenu
+--- a/drivers/pci/host/Makefile
++++ b/drivers/pci/host/Makefile
+@@ -15,3 +15,4 @@ obj-$(CONFIG_PCI_LAYERSCAPE) += pci-laye
+ obj-$(CONFIG_PCI_VERSATILE) += pci-versatile.o
+ obj-$(CONFIG_PCIE_IPROC) += pcie-iproc.o
+ obj-$(CONFIG_PCIE_IPROC_PLATFORM) += pcie-iproc-platform.o
++obj-$(CONFIG_PCIE_IPROC_BCMA) += pcie-iproc-bcma.o
+--- /dev/null
++++ b/drivers/pci/host/pcie-iproc-bcma.c
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (C) 2015 Broadcom Corporation
++ * Copyright (C) 2015 Hauke Mehrtens <hauke@hauke-m.de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ */
++
++#include <linux/kernel.h>
++#include <linux/pci.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/phy/phy.h>
++#include <linux/bcma/bcma.h>
++#include <linux/ioport.h>
++
++#include "pcie-iproc.h"
++
++
++/* NS: CLASS field is R/O, and set to wrong 0x200 value */
++static void bcma_pcie2_fixup_class(struct pci_dev *dev)
++{
++      dev->class = PCI_CLASS_BRIDGE_PCI << 8;
++}
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8011, bcma_pcie2_fixup_class);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8012, bcma_pcie2_fixup_class);
++
++static int iproc_pcie_bcma_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
++{
++      struct pci_sys_data *sys = dev->sysdata;
++      struct iproc_pcie *pcie = sys->private_data;
++      struct bcma_device *bdev = container_of(pcie->dev, struct bcma_device, dev);
++
++      return bcma_core_irq(bdev, 5);
++}
++
++static int iproc_pcie_bcma_probe(struct bcma_device *bdev)
++{
++      struct iproc_pcie *pcie;
++      LIST_HEAD(res);
++      struct resource res_mem;
++      int ret;
++
++      pcie = devm_kzalloc(&bdev->dev, sizeof(*pcie), GFP_KERNEL);
++      if (!pcie)
++              return -ENOMEM;
++
++      pcie->dev = &bdev->dev;
++      bcma_set_drvdata(bdev, pcie);
++
++      pcie->base = bdev->io_addr;
++
++      res_mem.start = bdev->addr_s[0];
++      res_mem.end = bdev->addr_s[0] + SZ_128M - 1;
++      res_mem.name = "PCIe MEM space";
++      res_mem.flags = IORESOURCE_MEM;
++      pci_add_resource(&res, &res_mem);
++
++      pcie->resources = &res;
++
++      pcie->map_irq = iproc_pcie_bcma_map_irq;
++
++      ret = iproc_pcie_setup(pcie);
++      if (ret) {
++              dev_err(pcie->dev, "PCIe controller setup failed\n");
++              return ret;
++      }
++
++      return 0;
++}
++
++static void iproc_pcie_bcma_remove(struct bcma_device *bdev)
++{
++      struct iproc_pcie *pcie = bcma_get_drvdata(bdev);
++
++      iproc_pcie_remove(pcie);
++}
++
++static const struct bcma_device_id iproc_pcie_bcma_table[] = {
++      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_PCIEG2, BCMA_ANY_REV, BCMA_ANY_CLASS),
++      {},
++};
++MODULE_DEVICE_TABLE(bcma, iproc_pcie_bcma_table);
++
++static struct bcma_driver iproc_pcie_bcma_driver = {
++      .name           = KBUILD_MODNAME,
++      .id_table       = iproc_pcie_bcma_table,
++      .probe          = iproc_pcie_bcma_probe,
++      .remove         = iproc_pcie_bcma_remove,
++};
++
++static int __init iproc_pcie_bcma_init(void)
++{
++      return bcma_driver_register(&iproc_pcie_bcma_driver);
++}
++module_init(iproc_pcie_bcma_init);
++
++static void __exit iproc_pcie_bcma_exit(void)
++{
++      bcma_driver_unregister(&iproc_pcie_bcma_driver);
++}
++module_exit(iproc_pcie_bcma_exit);
++
++MODULE_AUTHOR("Hauke Mehrtens");
++MODULE_DESCRIPTION("Broadcom iProc PCIe BCMA driver");
++MODULE_LICENSE("GPL v2");
diff --git a/target/linux/bcm53xx/patches-4.1/030-PCI-iproc-Allow-override-of-device-tree-IRQ-mapping-.patch b/target/linux/bcm53xx/patches-4.1/030-PCI-iproc-Allow-override-of-device-tree-IRQ-mapping-.patch
deleted file mode 100644 (file)
index 9050f72..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-From c1e02ceaf5739d32f092ac07bf886a0281ec40b1 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Tue, 12 May 2015 23:23:00 +0200
-Subject: [PATCH 1/2] PCI: iproc: Allow override of device tree IRQ mapping
- function
-
-The iProc core PCIe driver defaults to using of_irq_parse_and_map_pci() for
-IRQ mapping.  Add iproc_pcie.map_irq so bus interfaces that don't use
-device tree can override this by supplying their own IRQ mapping function.
-
-[bhelgaas: changelog]
-Posting: http://lkml.kernel.org/r/1431465781-10753-1-git-send-email-hauke@hauke-m.de
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-Reviewed-by: Ray Jui <rjui@broadcom.com.com>
----
- drivers/pci/host/pcie-iproc-platform.c | 2 ++
- drivers/pci/host/pcie-iproc.c          | 2 +-
- drivers/pci/host/pcie-iproc.h          | 1 +
- 3 files changed, 4 insertions(+), 1 deletion(-)
-
---- a/drivers/pci/host/pcie-iproc-platform.c
-+++ b/drivers/pci/host/pcie-iproc-platform.c
-@@ -71,6 +71,8 @@ static int iproc_pcie_pltfm_probe(struct
-       pcie->resources = &res;
-+      pcie->map_irq = of_irq_parse_and_map_pci;
-+
-       ret = iproc_pcie_setup(pcie);
-       if (ret) {
-               dev_err(pcie->dev, "PCIe controller setup failed\n");
---- a/drivers/pci/host/pcie-iproc.c
-+++ b/drivers/pci/host/pcie-iproc.c
-@@ -229,7 +229,7 @@ int iproc_pcie_setup(struct iproc_pcie *
-       pci_scan_child_bus(bus);
-       pci_assign_unassigned_bus_resources(bus);
--      pci_fixup_irqs(pci_common_swizzle, of_irq_parse_and_map_pci);
-+      pci_fixup_irqs(pci_common_swizzle, pcie->map_irq);
-       pci_bus_add_devices(bus);
-       return 0;
---- a/drivers/pci/host/pcie-iproc.h
-+++ b/drivers/pci/host/pcie-iproc.h
-@@ -34,6 +34,7 @@ struct iproc_pcie {
-       struct pci_bus *root_bus;
-       struct phy *phy;
-       int irqs[IPROC_PCIE_MAX_NUM_IRQS];
-+      int (*map_irq)(const struct pci_dev *, u8, u8);
- };
- int iproc_pcie_setup(struct iproc_pcie *pcie);
diff --git a/target/linux/bcm53xx/patches-4.1/031-0001-PCI-iproc-Directly-add-PCI-resources.patch b/target/linux/bcm53xx/patches-4.1/031-0001-PCI-iproc-Directly-add-PCI-resources.patch
new file mode 100644 (file)
index 0000000..09d8226
--- /dev/null
@@ -0,0 +1,90 @@
+From 18c4342aa56d70176eea85021e6fe8f6f8f39c7b Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Sun, 24 May 2015 22:37:02 +0200
+Subject: [PATCH 1/2] PCI: iproc: Directly add PCI resources
+
+The struct iproc_pcie.resources member was pointing to a stack variable and
+is invalid after the registration function returned.
+
+Remove this pointer and add a parameter to the function.
+
+Tested-by: Ray Jui <rjui@broadcom.com>
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Ray Jui <rjui@broadcom.com>
+---
+ drivers/pci/host/pcie-iproc-bcma.c     | 4 +---
+ drivers/pci/host/pcie-iproc-platform.c | 4 +---
+ drivers/pci/host/pcie-iproc.c          | 4 ++--
+ drivers/pci/host/pcie-iproc.h          | 3 +--
+ 4 files changed, 5 insertions(+), 10 deletions(-)
+
+--- a/drivers/pci/host/pcie-iproc-bcma.c
++++ b/drivers/pci/host/pcie-iproc-bcma.c
+@@ -62,11 +62,9 @@ static int iproc_pcie_bcma_probe(struct
+       res_mem.flags = IORESOURCE_MEM;
+       pci_add_resource(&res, &res_mem);
+-      pcie->resources = &res;
+-
+       pcie->map_irq = iproc_pcie_bcma_map_irq;
+-      ret = iproc_pcie_setup(pcie);
++      ret = iproc_pcie_setup(pcie, &res);
+       if (ret) {
+               dev_err(pcie->dev, "PCIe controller setup failed\n");
+               return ret;
+--- a/drivers/pci/host/pcie-iproc-platform.c
++++ b/drivers/pci/host/pcie-iproc-platform.c
+@@ -69,11 +69,9 @@ static int iproc_pcie_pltfm_probe(struct
+               return ret;
+       }
+-      pcie->resources = &res;
+-
+       pcie->map_irq = of_irq_parse_and_map_pci;
+-      ret = iproc_pcie_setup(pcie);
++      ret = iproc_pcie_setup(pcie, &res);
+       if (ret) {
+               dev_err(pcie->dev, "PCIe controller setup failed\n");
+               return ret;
+--- a/drivers/pci/host/pcie-iproc.c
++++ b/drivers/pci/host/pcie-iproc.c
+@@ -183,7 +183,7 @@ static void iproc_pcie_enable(struct ipr
+       writel(SYS_RC_INTX_MASK, pcie->base + SYS_RC_INTX_EN);
+ }
+-int iproc_pcie_setup(struct iproc_pcie *pcie)
++int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
+ {
+       int ret;
+       struct pci_bus *bus;
+@@ -211,7 +211,7 @@ int iproc_pcie_setup(struct iproc_pcie *
+       pcie->sysdata.private_data = pcie;
+       bus = pci_create_root_bus(pcie->dev, 0, &iproc_pcie_ops,
+-                                &pcie->sysdata, pcie->resources);
++                                &pcie->sysdata, res);
+       if (!bus) {
+               dev_err(pcie->dev, "unable to create PCI root bus\n");
+               ret = -ENOMEM;
+--- a/drivers/pci/host/pcie-iproc.h
++++ b/drivers/pci/host/pcie-iproc.h
+@@ -29,7 +29,6 @@
+ struct iproc_pcie {
+       struct device *dev;
+       void __iomem *base;
+-      struct list_head *resources;
+       struct pci_sys_data sysdata;
+       struct pci_bus *root_bus;
+       struct phy *phy;
+@@ -37,7 +36,7 @@ struct iproc_pcie {
+       int (*map_irq)(const struct pci_dev *, u8, u8);
+ };
+-int iproc_pcie_setup(struct iproc_pcie *pcie);
++int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res);
+ int iproc_pcie_remove(struct iproc_pcie *pcie);
+ #endif /* _PCIE_IPROC_H */
diff --git a/target/linux/bcm53xx/patches-4.1/031-0002-PCI-iproc-Free-resource-list-after-registration.patch b/target/linux/bcm53xx/patches-4.1/031-0002-PCI-iproc-Free-resource-list-after-registration.patch
new file mode 100644 (file)
index 0000000..bbd3164
--- /dev/null
@@ -0,0 +1,57 @@
+From ef07991a95de76b07594448c3521361831ec2cfe Mon Sep 17 00:00:00 2001
+From: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Sun, 24 May 2015 22:37:03 +0200
+Subject: [PATCH 2/2] PCI: iproc: Free resource list after registration
+
+The resource list is only used in the setup process and was never freed.
+pci_add_resource() allocates a memory area to store the list item.
+
+Fix the memory leak.
+
+Tested-by: Ray Jui <rjui@broadcom.com>
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Ray Jui <rjui@broadcom.com>
+---
+ drivers/pci/host/pcie-iproc-bcma.c     | 8 ++++----
+ drivers/pci/host/pcie-iproc-platform.c | 8 ++++----
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+--- a/drivers/pci/host/pcie-iproc-bcma.c
++++ b/drivers/pci/host/pcie-iproc-bcma.c
+@@ -65,12 +65,12 @@ static int iproc_pcie_bcma_probe(struct
+       pcie->map_irq = iproc_pcie_bcma_map_irq;
+       ret = iproc_pcie_setup(pcie, &res);
+-      if (ret) {
++      if (ret)
+               dev_err(pcie->dev, "PCIe controller setup failed\n");
+-              return ret;
+-      }
+-      return 0;
++      pci_free_resource_list(&res);
++
++      return ret;
+ }
+ static void iproc_pcie_bcma_remove(struct bcma_device *bdev)
+--- a/drivers/pci/host/pcie-iproc-platform.c
++++ b/drivers/pci/host/pcie-iproc-platform.c
+@@ -72,12 +72,12 @@ static int iproc_pcie_pltfm_probe(struct
+       pcie->map_irq = of_irq_parse_and_map_pci;
+       ret = iproc_pcie_setup(pcie, &res);
+-      if (ret) {
++      if (ret)
+               dev_err(pcie->dev, "PCIe controller setup failed\n");
+-              return ret;
+-      }
+-      return 0;
++      pci_free_resource_list(&res);
++
++      return ret;
+ }
+ static int iproc_pcie_pltfm_remove(struct platform_device *pdev)
diff --git a/target/linux/bcm53xx/patches-4.1/031-PCI-iproc-Add-BCMA-PCIe-driver.patch b/target/linux/bcm53xx/patches-4.1/031-PCI-iproc-Add-BCMA-PCIe-driver.patch
deleted file mode 100644 (file)
index a850baf..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-From 4785ffbdc9b52e308e43b9e2dcc1dca44f056d76 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Tue, 12 May 2015 23:23:01 +0200
-Subject: [PATCH 2/2] PCI: iproc: Add BCMA PCIe driver
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This driver adds support for the PCIe 2.0 controller found on the BCMA bus.
-This controller can be found on (mostly) all Broadcom BCM470X / BCM5301X
-ARM SoCs.
-
-The driver found in the Broadcom SDK does some more stuff, like setting up
-some DMA memory areas, chaining MPS and MRRS to 512 and also some PHY
-changes like "improving" the PCIe jitter and doing some special
-initialization for the 3rd PCIe port.
-
-This was tested on a bcm4708 board with 2 PCIe ports and wireless cards
-connected to them.
-
-PCI_DOMAINS is needed by this driver, because normally there is more than
-one PCIe controller and without PCI_DOMAINS only the first controller gets
-registered.  This controller gets 6 IRQs; the last one is trigged by all
-IRQ events.
-
-[bhelgaas: fix "GPLv2" MODULE_LICENSE typo]
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-Acked-by: Rafał Miłecki <zajec5@gmail.com>
-Acked-by: Ray Jui <rjui@broadcom.com.com>
----
- drivers/pci/host/Kconfig           |  11 ++++
- drivers/pci/host/Makefile          |   1 +
- drivers/pci/host/pcie-iproc-bcma.c | 112 +++++++++++++++++++++++++++++++++++++
- 3 files changed, 124 insertions(+)
- create mode 100644 drivers/pci/host/pcie-iproc-bcma.c
-
---- a/drivers/pci/host/Kconfig
-+++ b/drivers/pci/host/Kconfig
-@@ -125,4 +125,15 @@ config PCIE_IPROC_PLATFORM
-         Say Y here if you want to use the Broadcom iProc PCIe controller
-         through the generic platform bus interface
-+config PCIE_IPROC_BCMA
-+      bool "Broadcom iProc PCIe BCMA bus driver"
-+      depends on ARCH_BCM_IPROC || (ARM && COMPILE_TEST)
-+      select PCIE_IPROC
-+      select BCMA
-+      select PCI_DOMAINS
-+      default ARCH_BCM_5301X
-+      help
-+        Say Y here if you want to use the Broadcom iProc PCIe controller
-+        through the BCMA bus interface
-+
- endmenu
---- a/drivers/pci/host/Makefile
-+++ b/drivers/pci/host/Makefile
-@@ -15,3 +15,4 @@ obj-$(CONFIG_PCI_LAYERSCAPE) += pci-laye
- obj-$(CONFIG_PCI_VERSATILE) += pci-versatile.o
- obj-$(CONFIG_PCIE_IPROC) += pcie-iproc.o
- obj-$(CONFIG_PCIE_IPROC_PLATFORM) += pcie-iproc-platform.o
-+obj-$(CONFIG_PCIE_IPROC_BCMA) += pcie-iproc-bcma.o
---- /dev/null
-+++ b/drivers/pci/host/pcie-iproc-bcma.c
-@@ -0,0 +1,112 @@
-+/*
-+ * Copyright (C) 2015 Broadcom Corporation
-+ * Copyright (C) 2015 Hauke Mehrtens <hauke@hauke-m.de>
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation version 2.
-+ *
-+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
-+ * kind, whether express or implied; without even the implied warranty
-+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/phy/phy.h>
-+#include <linux/bcma/bcma.h>
-+#include <linux/ioport.h>
-+
-+#include "pcie-iproc.h"
-+
-+
-+/* NS: CLASS field is R/O, and set to wrong 0x200 value */
-+static void bcma_pcie2_fixup_class(struct pci_dev *dev)
-+{
-+      dev->class = PCI_CLASS_BRIDGE_PCI << 8;
-+}
-+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8011, bcma_pcie2_fixup_class);
-+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_BROADCOM, 0x8012, bcma_pcie2_fixup_class);
-+
-+static int iproc_pcie_bcma_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+      struct pci_sys_data *sys = dev->sysdata;
-+      struct iproc_pcie *pcie = sys->private_data;
-+      struct bcma_device *bdev = container_of(pcie->dev, struct bcma_device, dev);
-+
-+      return bcma_core_irq(bdev, 5);
-+}
-+
-+static int iproc_pcie_bcma_probe(struct bcma_device *bdev)
-+{
-+      struct iproc_pcie *pcie;
-+      LIST_HEAD(res);
-+      struct resource res_mem;
-+      int ret;
-+
-+      pcie = devm_kzalloc(&bdev->dev, sizeof(*pcie), GFP_KERNEL);
-+      if (!pcie)
-+              return -ENOMEM;
-+
-+      pcie->dev = &bdev->dev;
-+      bcma_set_drvdata(bdev, pcie);
-+
-+      pcie->base = bdev->io_addr;
-+
-+      res_mem.start = bdev->addr_s[0];
-+      res_mem.end = bdev->addr_s[0] + SZ_128M - 1;
-+      res_mem.name = "PCIe MEM space";
-+      res_mem.flags = IORESOURCE_MEM;
-+      pci_add_resource(&res, &res_mem);
-+
-+      pcie->resources = &res;
-+
-+      pcie->map_irq = iproc_pcie_bcma_map_irq;
-+
-+      ret = iproc_pcie_setup(pcie);
-+      if (ret) {
-+              dev_err(pcie->dev, "PCIe controller setup failed\n");
-+              return ret;
-+      }
-+
-+      return 0;
-+}
-+
-+static void iproc_pcie_bcma_remove(struct bcma_device *bdev)
-+{
-+      struct iproc_pcie *pcie = bcma_get_drvdata(bdev);
-+
-+      iproc_pcie_remove(pcie);
-+}
-+
-+static const struct bcma_device_id iproc_pcie_bcma_table[] = {
-+      BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_PCIEG2, BCMA_ANY_REV, BCMA_ANY_CLASS),
-+      {},
-+};
-+MODULE_DEVICE_TABLE(bcma, iproc_pcie_bcma_table);
-+
-+static struct bcma_driver iproc_pcie_bcma_driver = {
-+      .name           = KBUILD_MODNAME,
-+      .id_table       = iproc_pcie_bcma_table,
-+      .probe          = iproc_pcie_bcma_probe,
-+      .remove         = iproc_pcie_bcma_remove,
-+};
-+
-+static int __init iproc_pcie_bcma_init(void)
-+{
-+      return bcma_driver_register(&iproc_pcie_bcma_driver);
-+}
-+module_init(iproc_pcie_bcma_init);
-+
-+static void __exit iproc_pcie_bcma_exit(void)
-+{
-+      bcma_driver_unregister(&iproc_pcie_bcma_driver);
-+}
-+module_exit(iproc_pcie_bcma_exit);
-+
-+MODULE_AUTHOR("Hauke Mehrtens");
-+MODULE_DESCRIPTION("Broadcom iProc PCIe BCMA driver");
-+MODULE_LICENSE("GPL v2");
diff --git a/target/linux/bcm53xx/patches-4.1/032-PCI-iproc-Delete-unnecessary-checks-before-phy-calls.patch b/target/linux/bcm53xx/patches-4.1/032-PCI-iproc-Delete-unnecessary-checks-before-phy-calls.patch
new file mode 100644 (file)
index 0000000..fc83337
--- /dev/null
@@ -0,0 +1,79 @@
+From 93972d18bbaba6f34e21742400b6e7461edc4837 Mon Sep 17 00:00:00 2001
+From: Markus Elfring <elfring@users.sourceforge.net>
+Date: Sun, 28 Jun 2015 16:42:04 +0200
+Subject: [PATCH] PCI: iproc: Delete unnecessary checks before phy calls
+
+The functions phy_exit() and phy_power_off() test whether their argument is
+NULL and then return immediately.  Thus the test around the calls is not
+needed.
+
+This issue was detected by using the Coccinelle software.
+
+[bhelgaas: also phy_init() and phy_power_on(), as Ray Jui suggested]
+[bhelgaas: also remove tests in iproc_pcie_remove()]
+Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Ray Jui <rjui@broadcom.com>
+---
+ drivers/pci/host/pcie-iproc.c | 34 +++++++++++++---------------------
+ 1 file changed, 13 insertions(+), 21 deletions(-)
+
+--- a/drivers/pci/host/pcie-iproc.c
++++ b/drivers/pci/host/pcie-iproc.c
+@@ -191,19 +191,16 @@ int iproc_pcie_setup(struct iproc_pcie *
+       if (!pcie || !pcie->dev || !pcie->base)
+               return -EINVAL;
+-      if (pcie->phy) {
+-              ret = phy_init(pcie->phy);
+-              if (ret) {
+-                      dev_err(pcie->dev, "unable to initialize PCIe PHY\n");
+-                      return ret;
+-              }
+-
+-              ret = phy_power_on(pcie->phy);
+-              if (ret) {
+-                      dev_err(pcie->dev, "unable to power on PCIe PHY\n");
+-                      goto err_exit_phy;
+-              }
++      ret = phy_init(pcie->phy);
++      if (ret) {
++              dev_err(pcie->dev, "unable to initialize PCIe PHY\n");
++              return ret;
++      }
++      ret = phy_power_on(pcie->phy);
++      if (ret) {
++              dev_err(pcie->dev, "unable to power on PCIe PHY\n");
++              goto err_exit_phy;
+       }
+       iproc_pcie_reset(pcie);
+@@ -239,12 +236,9 @@ err_rm_root_bus:
+       pci_remove_root_bus(bus);
+ err_power_off_phy:
+-      if (pcie->phy)
+-              phy_power_off(pcie->phy);
++      phy_power_off(pcie->phy);
+ err_exit_phy:
+-      if (pcie->phy)
+-              phy_exit(pcie->phy);
+-
++      phy_exit(pcie->phy);
+       return ret;
+ }
+ EXPORT_SYMBOL(iproc_pcie_setup);
+@@ -254,10 +248,8 @@ int iproc_pcie_remove(struct iproc_pcie
+       pci_stop_root_bus(pcie->root_bus);
+       pci_remove_root_bus(pcie->root_bus);
+-      if (pcie->phy) {
+-              phy_power_off(pcie->phy);
+-              phy_exit(pcie->phy);
+-      }
++      phy_power_off(pcie->phy);
++      phy_exit(pcie->phy);
+       return 0;
+ }
diff --git a/target/linux/bcm53xx/patches-4.1/032-PCI-iproc-Directly-add-PCI-resources.patch b/target/linux/bcm53xx/patches-4.1/032-PCI-iproc-Directly-add-PCI-resources.patch
deleted file mode 100644 (file)
index 09d8226..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-From 18c4342aa56d70176eea85021e6fe8f6f8f39c7b Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sun, 24 May 2015 22:37:02 +0200
-Subject: [PATCH 1/2] PCI: iproc: Directly add PCI resources
-
-The struct iproc_pcie.resources member was pointing to a stack variable and
-is invalid after the registration function returned.
-
-Remove this pointer and add a parameter to the function.
-
-Tested-by: Ray Jui <rjui@broadcom.com>
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-Reviewed-by: Ray Jui <rjui@broadcom.com>
----
- drivers/pci/host/pcie-iproc-bcma.c     | 4 +---
- drivers/pci/host/pcie-iproc-platform.c | 4 +---
- drivers/pci/host/pcie-iproc.c          | 4 ++--
- drivers/pci/host/pcie-iproc.h          | 3 +--
- 4 files changed, 5 insertions(+), 10 deletions(-)
-
---- a/drivers/pci/host/pcie-iproc-bcma.c
-+++ b/drivers/pci/host/pcie-iproc-bcma.c
-@@ -62,11 +62,9 @@ static int iproc_pcie_bcma_probe(struct
-       res_mem.flags = IORESOURCE_MEM;
-       pci_add_resource(&res, &res_mem);
--      pcie->resources = &res;
--
-       pcie->map_irq = iproc_pcie_bcma_map_irq;
--      ret = iproc_pcie_setup(pcie);
-+      ret = iproc_pcie_setup(pcie, &res);
-       if (ret) {
-               dev_err(pcie->dev, "PCIe controller setup failed\n");
-               return ret;
---- a/drivers/pci/host/pcie-iproc-platform.c
-+++ b/drivers/pci/host/pcie-iproc-platform.c
-@@ -69,11 +69,9 @@ static int iproc_pcie_pltfm_probe(struct
-               return ret;
-       }
--      pcie->resources = &res;
--
-       pcie->map_irq = of_irq_parse_and_map_pci;
--      ret = iproc_pcie_setup(pcie);
-+      ret = iproc_pcie_setup(pcie, &res);
-       if (ret) {
-               dev_err(pcie->dev, "PCIe controller setup failed\n");
-               return ret;
---- a/drivers/pci/host/pcie-iproc.c
-+++ b/drivers/pci/host/pcie-iproc.c
-@@ -183,7 +183,7 @@ static void iproc_pcie_enable(struct ipr
-       writel(SYS_RC_INTX_MASK, pcie->base + SYS_RC_INTX_EN);
- }
--int iproc_pcie_setup(struct iproc_pcie *pcie)
-+int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
- {
-       int ret;
-       struct pci_bus *bus;
-@@ -211,7 +211,7 @@ int iproc_pcie_setup(struct iproc_pcie *
-       pcie->sysdata.private_data = pcie;
-       bus = pci_create_root_bus(pcie->dev, 0, &iproc_pcie_ops,
--                                &pcie->sysdata, pcie->resources);
-+                                &pcie->sysdata, res);
-       if (!bus) {
-               dev_err(pcie->dev, "unable to create PCI root bus\n");
-               ret = -ENOMEM;
---- a/drivers/pci/host/pcie-iproc.h
-+++ b/drivers/pci/host/pcie-iproc.h
-@@ -29,7 +29,6 @@
- struct iproc_pcie {
-       struct device *dev;
-       void __iomem *base;
--      struct list_head *resources;
-       struct pci_sys_data sysdata;
-       struct pci_bus *root_bus;
-       struct phy *phy;
-@@ -37,7 +36,7 @@ struct iproc_pcie {
-       int (*map_irq)(const struct pci_dev *, u8, u8);
- };
--int iproc_pcie_setup(struct iproc_pcie *pcie);
-+int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res);
- int iproc_pcie_remove(struct iproc_pcie *pcie);
- #endif /* _PCIE_IPROC_H */
diff --git a/target/linux/bcm53xx/patches-4.1/033-0001-PCI-iproc-enable-arm64-support-for-iProc-PCIe.patch b/target/linux/bcm53xx/patches-4.1/033-0001-PCI-iproc-enable-arm64-support-for-iProc-PCIe.patch
new file mode 100644 (file)
index 0000000..78160f0
--- /dev/null
@@ -0,0 +1,116 @@
+From db9d6d790968fd6df9faa7fa1f51967e05afd492 Mon Sep 17 00:00:00 2001
+From: Ray Jui <rjui@broadcom.com>
+Date: Mon, 27 Jul 2015 15:42:18 -0700
+Subject: [PATCH 1/4] PCI: iproc: enable arm64 support for iProc PCIe
+
+PCI: iproc: Add arm64 support
+
+Add arm64 support to the iProc PCIe driver.
+
+Note that on arm32, bus->sysdata points to the arm32-specific
+pci_sys_data struct, and pci_sys_data.private_data contains the
+iproc_pcie pointer. For arm64, there's nothing corresponding to
+pci_sys_data, so we keep the iproc_pcie pointer directly in
+bus->sysdata.
+
+In addition, arm64 does IRQ mapping in pcibios_add_device(), so it
+doesn't need pci_fixup_irqs() as arm32 does.
+
+Signed-off-by: Ray Jui <rjui@broadcom.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Scott Branden <sbranden@broadcom.com>
+Acked-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Olof Johansson <olof@lixom.net>
+---
+ drivers/pci/host/pcie-iproc.c | 27 ++++++++++++++++++++-------
+ drivers/pci/host/pcie-iproc.h |  4 +++-
+ 2 files changed, 23 insertions(+), 8 deletions(-)
+
+--- a/drivers/pci/host/pcie-iproc.c
++++ b/drivers/pci/host/pcie-iproc.c
+@@ -58,9 +58,17 @@
+ #define SYS_RC_INTX_EN               0x330
+ #define SYS_RC_INTX_MASK             0xf
+-static inline struct iproc_pcie *sys_to_pcie(struct pci_sys_data *sys)
++static inline struct iproc_pcie *iproc_data(struct pci_bus *bus)
+ {
+-      return sys->private_data;
++      struct iproc_pcie *pcie;
++#ifdef CONFIG_ARM
++      struct pci_sys_data *sys = bus->sysdata;
++
++      pcie = sys->private_data;
++#else
++      pcie = bus->sysdata;
++#endif
++      return pcie;
+ }
+ /**
+@@ -71,8 +79,7 @@ static void __iomem *iproc_pcie_map_cfg_
+                                           unsigned int devfn,
+                                           int where)
+ {
+-      struct pci_sys_data *sys = bus->sysdata;
+-      struct iproc_pcie *pcie = sys_to_pcie(sys);
++      struct iproc_pcie *pcie = iproc_data(bus);
+       unsigned slot = PCI_SLOT(devfn);
+       unsigned fn = PCI_FUNC(devfn);
+       unsigned busno = bus->number;
+@@ -186,6 +193,7 @@ static void iproc_pcie_enable(struct ipr
+ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
+ {
+       int ret;
++      void *sysdata;
+       struct pci_bus *bus;
+       if (!pcie || !pcie->dev || !pcie->base)
+@@ -205,10 +213,13 @@ int iproc_pcie_setup(struct iproc_pcie *
+       iproc_pcie_reset(pcie);
++#ifdef CONFIG_ARM
+       pcie->sysdata.private_data = pcie;
+-
+-      bus = pci_create_root_bus(pcie->dev, 0, &iproc_pcie_ops,
+-                                &pcie->sysdata, res);
++      sysdata = &pcie->sysdata;
++#else
++      sysdata = pcie;
++#endif
++      bus = pci_create_root_bus(pcie->dev, 0, &iproc_pcie_ops, sysdata, res);
+       if (!bus) {
+               dev_err(pcie->dev, "unable to create PCI root bus\n");
+               ret = -ENOMEM;
+@@ -226,7 +237,9 @@ int iproc_pcie_setup(struct iproc_pcie *
+       pci_scan_child_bus(bus);
+       pci_assign_unassigned_bus_resources(bus);
++#ifdef CONFIG_ARM
+       pci_fixup_irqs(pci_common_swizzle, pcie->map_irq);
++#endif
+       pci_bus_add_devices(bus);
+       return 0;
+--- a/drivers/pci/host/pcie-iproc.h
++++ b/drivers/pci/host/pcie-iproc.h
+@@ -21,7 +21,7 @@
+  * @dev: pointer to device data structure
+  * @base: PCIe host controller I/O register base
+  * @resources: linked list of all PCI resources
+- * @sysdata: Per PCI controller data
++ * @sysdata: Per PCI controller data (ARM-specific)
+  * @root_bus: pointer to root bus
+  * @phy: optional PHY device that controls the Serdes
+  * @irqs: interrupt IDs
+@@ -29,7 +29,9 @@
+ struct iproc_pcie {
+       struct device *dev;
+       void __iomem *base;
++#ifdef CONFIG_ARM
+       struct pci_sys_data sysdata;
++#endif
+       struct pci_bus *root_bus;
+       struct phy *phy;
+       int irqs[IPROC_PCIE_MAX_NUM_IRQS];
diff --git a/target/linux/bcm53xx/patches-4.1/033-0002-PCI-iproc-Fix-ARM64-dependency-in-Kconfig.patch b/target/linux/bcm53xx/patches-4.1/033-0002-PCI-iproc-Fix-ARM64-dependency-in-Kconfig.patch
new file mode 100644 (file)
index 0000000..414a83f
--- /dev/null
@@ -0,0 +1,27 @@
+From b00c4415fb231f276221c634a47ce7328df9aae5 Mon Sep 17 00:00:00 2001
+From: Ray Jui <rjui@broadcom.com>
+Date: Mon, 27 Jul 2015 15:42:19 -0700
+Subject: [PATCH 2/4] PCI: iproc: Fix ARM64 dependency in Kconfig
+
+Allow Broadcom iProc PCIe core driver to be compiled for ARM64
+
+Signed-off-by: Ray Jui <rjui@broadcom.com>
+Reviewed-by: Vikram Prakash <vikramp@broadcom.com>
+Reviewed-by: Scott Branden <sbranden@broadcom.com>
+Acked-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Olof Johansson <olof@lixom.net>
+---
+ drivers/pci/host/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/pci/host/Kconfig
++++ b/drivers/pci/host/Kconfig
+@@ -108,7 +108,7 @@ config PCI_VERSATILE
+ config PCIE_IPROC
+       tristate "Broadcom iProc PCIe controller"
+-      depends on OF && ARM
++      depends on OF && (ARM || ARM64)
+       default n
+       help
+         This enables the iProc PCIe core controller support for Broadcom's
diff --git a/target/linux/bcm53xx/patches-4.1/033-PCI-iproc-Free-resource-list-after-registration.patch b/target/linux/bcm53xx/patches-4.1/033-PCI-iproc-Free-resource-list-after-registration.patch
deleted file mode 100644 (file)
index bbd3164..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-From ef07991a95de76b07594448c3521361831ec2cfe Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sun, 24 May 2015 22:37:03 +0200
-Subject: [PATCH 2/2] PCI: iproc: Free resource list after registration
-
-The resource list is only used in the setup process and was never freed.
-pci_add_resource() allocates a memory area to store the list item.
-
-Fix the memory leak.
-
-Tested-by: Ray Jui <rjui@broadcom.com>
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-Reviewed-by: Ray Jui <rjui@broadcom.com>
----
- drivers/pci/host/pcie-iproc-bcma.c     | 8 ++++----
- drivers/pci/host/pcie-iproc-platform.c | 8 ++++----
- 2 files changed, 8 insertions(+), 8 deletions(-)
-
---- a/drivers/pci/host/pcie-iproc-bcma.c
-+++ b/drivers/pci/host/pcie-iproc-bcma.c
-@@ -65,12 +65,12 @@ static int iproc_pcie_bcma_probe(struct
-       pcie->map_irq = iproc_pcie_bcma_map_irq;
-       ret = iproc_pcie_setup(pcie, &res);
--      if (ret) {
-+      if (ret)
-               dev_err(pcie->dev, "PCIe controller setup failed\n");
--              return ret;
--      }
--      return 0;
-+      pci_free_resource_list(&res);
-+
-+      return ret;
- }
- static void iproc_pcie_bcma_remove(struct bcma_device *bdev)
---- a/drivers/pci/host/pcie-iproc-platform.c
-+++ b/drivers/pci/host/pcie-iproc-platform.c
-@@ -72,12 +72,12 @@ static int iproc_pcie_pltfm_probe(struct
-       pcie->map_irq = of_irq_parse_and_map_pci;
-       ret = iproc_pcie_setup(pcie, &res);
--      if (ret) {
-+      if (ret)
-               dev_err(pcie->dev, "PCIe controller setup failed\n");
--              return ret;
--      }
--      return 0;
-+      pci_free_resource_list(&res);
-+
-+      return ret;
- }
- static int iproc_pcie_pltfm_remove(struct platform_device *pdev)
diff --git a/target/linux/bcm53xx/patches-4.1/035-PCI-iproc-Delete-unnecessary-checks-before-phy-calls.patch b/target/linux/bcm53xx/patches-4.1/035-PCI-iproc-Delete-unnecessary-checks-before-phy-calls.patch
deleted file mode 100644 (file)
index fc83337..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-From 93972d18bbaba6f34e21742400b6e7461edc4837 Mon Sep 17 00:00:00 2001
-From: Markus Elfring <elfring@users.sourceforge.net>
-Date: Sun, 28 Jun 2015 16:42:04 +0200
-Subject: [PATCH] PCI: iproc: Delete unnecessary checks before phy calls
-
-The functions phy_exit() and phy_power_off() test whether their argument is
-NULL and then return immediately.  Thus the test around the calls is not
-needed.
-
-This issue was detected by using the Coccinelle software.
-
-[bhelgaas: also phy_init() and phy_power_on(), as Ray Jui suggested]
-[bhelgaas: also remove tests in iproc_pcie_remove()]
-Signed-off-by: Markus Elfring <elfring@users.sourceforge.net>
-Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-Reviewed-by: Ray Jui <rjui@broadcom.com>
----
- drivers/pci/host/pcie-iproc.c | 34 +++++++++++++---------------------
- 1 file changed, 13 insertions(+), 21 deletions(-)
-
---- a/drivers/pci/host/pcie-iproc.c
-+++ b/drivers/pci/host/pcie-iproc.c
-@@ -191,19 +191,16 @@ int iproc_pcie_setup(struct iproc_pcie *
-       if (!pcie || !pcie->dev || !pcie->base)
-               return -EINVAL;
--      if (pcie->phy) {
--              ret = phy_init(pcie->phy);
--              if (ret) {
--                      dev_err(pcie->dev, "unable to initialize PCIe PHY\n");
--                      return ret;
--              }
--
--              ret = phy_power_on(pcie->phy);
--              if (ret) {
--                      dev_err(pcie->dev, "unable to power on PCIe PHY\n");
--                      goto err_exit_phy;
--              }
-+      ret = phy_init(pcie->phy);
-+      if (ret) {
-+              dev_err(pcie->dev, "unable to initialize PCIe PHY\n");
-+              return ret;
-+      }
-+      ret = phy_power_on(pcie->phy);
-+      if (ret) {
-+              dev_err(pcie->dev, "unable to power on PCIe PHY\n");
-+              goto err_exit_phy;
-       }
-       iproc_pcie_reset(pcie);
-@@ -239,12 +236,9 @@ err_rm_root_bus:
-       pci_remove_root_bus(bus);
- err_power_off_phy:
--      if (pcie->phy)
--              phy_power_off(pcie->phy);
-+      phy_power_off(pcie->phy);
- err_exit_phy:
--      if (pcie->phy)
--              phy_exit(pcie->phy);
--
-+      phy_exit(pcie->phy);
-       return ret;
- }
- EXPORT_SYMBOL(iproc_pcie_setup);
-@@ -254,10 +248,8 @@ int iproc_pcie_remove(struct iproc_pcie
-       pci_stop_root_bus(pcie->root_bus);
-       pci_remove_root_bus(pcie->root_bus);
--      if (pcie->phy) {
--              phy_power_off(pcie->phy);
--              phy_exit(pcie->phy);
--      }
-+      phy_power_off(pcie->phy);
-+      phy_exit(pcie->phy);
-       return 0;
- }
diff --git a/target/linux/bcm53xx/patches-4.1/037-PCI-iproc-enable-arm64-support-for-iProc-PCIe.patch b/target/linux/bcm53xx/patches-4.1/037-PCI-iproc-enable-arm64-support-for-iProc-PCIe.patch
deleted file mode 100644 (file)
index 641efd8..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-From db9d6d790968fd6df9faa7fa1f51967e05afd492 Mon Sep 17 00:00:00 2001
-From: Ray Jui <rjui@broadcom.com>
-Date: Mon, 27 Jul 2015 15:42:18 -0700
-Subject: [PATCH 37/40] PCI: iproc: enable arm64 support for iProc PCIe
-
-PCI: iproc: Add arm64 support
-
-Add arm64 support to the iProc PCIe driver.
-
-Note that on arm32, bus->sysdata points to the arm32-specific
-pci_sys_data struct, and pci_sys_data.private_data contains the
-iproc_pcie pointer. For arm64, there's nothing corresponding to
-pci_sys_data, so we keep the iproc_pcie pointer directly in
-bus->sysdata.
-
-In addition, arm64 does IRQ mapping in pcibios_add_device(), so it
-doesn't need pci_fixup_irqs() as arm32 does.
-
-Signed-off-by: Ray Jui <rjui@broadcom.com>
-Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
-Reviewed-by: Scott Branden <sbranden@broadcom.com>
-Acked-by: Bjorn Helgaas <bhelgaas@google.com>
-Signed-off-by: Olof Johansson <olof@lixom.net>
----
- drivers/pci/host/pcie-iproc.c | 27 ++++++++++++++++++++-------
- drivers/pci/host/pcie-iproc.h |  4 +++-
- 2 files changed, 23 insertions(+), 8 deletions(-)
-
---- a/drivers/pci/host/pcie-iproc.c
-+++ b/drivers/pci/host/pcie-iproc.c
-@@ -58,9 +58,17 @@
- #define SYS_RC_INTX_EN               0x330
- #define SYS_RC_INTX_MASK             0xf
--static inline struct iproc_pcie *sys_to_pcie(struct pci_sys_data *sys)
-+static inline struct iproc_pcie *iproc_data(struct pci_bus *bus)
- {
--      return sys->private_data;
-+      struct iproc_pcie *pcie;
-+#ifdef CONFIG_ARM
-+      struct pci_sys_data *sys = bus->sysdata;
-+
-+      pcie = sys->private_data;
-+#else
-+      pcie = bus->sysdata;
-+#endif
-+      return pcie;
- }
- /**
-@@ -71,8 +79,7 @@ static void __iomem *iproc_pcie_map_cfg_
-                                           unsigned int devfn,
-                                           int where)
- {
--      struct pci_sys_data *sys = bus->sysdata;
--      struct iproc_pcie *pcie = sys_to_pcie(sys);
-+      struct iproc_pcie *pcie = iproc_data(bus);
-       unsigned slot = PCI_SLOT(devfn);
-       unsigned fn = PCI_FUNC(devfn);
-       unsigned busno = bus->number;
-@@ -186,6 +193,7 @@ static void iproc_pcie_enable(struct ipr
- int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)
- {
-       int ret;
-+      void *sysdata;
-       struct pci_bus *bus;
-       if (!pcie || !pcie->dev || !pcie->base)
-@@ -205,10 +213,13 @@ int iproc_pcie_setup(struct iproc_pcie *
-       iproc_pcie_reset(pcie);
-+#ifdef CONFIG_ARM
-       pcie->sysdata.private_data = pcie;
--
--      bus = pci_create_root_bus(pcie->dev, 0, &iproc_pcie_ops,
--                                &pcie->sysdata, res);
-+      sysdata = &pcie->sysdata;
-+#else
-+      sysdata = pcie;
-+#endif
-+      bus = pci_create_root_bus(pcie->dev, 0, &iproc_pcie_ops, sysdata, res);
-       if (!bus) {
-               dev_err(pcie->dev, "unable to create PCI root bus\n");
-               ret = -ENOMEM;
-@@ -226,7 +237,9 @@ int iproc_pcie_setup(struct iproc_pcie *
-       pci_scan_child_bus(bus);
-       pci_assign_unassigned_bus_resources(bus);
-+#ifdef CONFIG_ARM
-       pci_fixup_irqs(pci_common_swizzle, pcie->map_irq);
-+#endif
-       pci_bus_add_devices(bus);
-       return 0;
---- a/drivers/pci/host/pcie-iproc.h
-+++ b/drivers/pci/host/pcie-iproc.h
-@@ -21,7 +21,7 @@
-  * @dev: pointer to device data structure
-  * @base: PCIe host controller I/O register base
-  * @resources: linked list of all PCI resources
-- * @sysdata: Per PCI controller data
-+ * @sysdata: Per PCI controller data (ARM-specific)
-  * @root_bus: pointer to root bus
-  * @phy: optional PHY device that controls the Serdes
-  * @irqs: interrupt IDs
-@@ -29,7 +29,9 @@
- struct iproc_pcie {
-       struct device *dev;
-       void __iomem *base;
-+#ifdef CONFIG_ARM
-       struct pci_sys_data sysdata;
-+#endif
-       struct pci_bus *root_bus;
-       struct phy *phy;
-       int irqs[IPROC_PCIE_MAX_NUM_IRQS];
diff --git a/target/linux/bcm53xx/patches-4.1/038-PCI-iproc-Fix-ARM64-dependency-in-Kconfig.patch b/target/linux/bcm53xx/patches-4.1/038-PCI-iproc-Fix-ARM64-dependency-in-Kconfig.patch
deleted file mode 100644 (file)
index 75847af..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-From b00c4415fb231f276221c634a47ce7328df9aae5 Mon Sep 17 00:00:00 2001
-From: Ray Jui <rjui@broadcom.com>
-Date: Mon, 27 Jul 2015 15:42:19 -0700
-Subject: [PATCH 38/40] PCI: iproc: Fix ARM64 dependency in Kconfig
-
-Allow Broadcom iProc PCIe core driver to be compiled for ARM64
-
-Signed-off-by: Ray Jui <rjui@broadcom.com>
-Reviewed-by: Vikram Prakash <vikramp@broadcom.com>
-Reviewed-by: Scott Branden <sbranden@broadcom.com>
-Acked-by: Bjorn Helgaas <bhelgaas@google.com>
-Signed-off-by: Olof Johansson <olof@lixom.net>
----
- drivers/pci/host/Kconfig | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/pci/host/Kconfig
-+++ b/drivers/pci/host/Kconfig
-@@ -108,7 +108,7 @@ config PCI_VERSATILE
- config PCIE_IPROC
-       tristate "Broadcom iProc PCIe controller"
--      depends on OF && ARM
-+      depends on OF && (ARM || ARM64)
-       default n
-       help
-         This enables the iProc PCIe core controller support for Broadcom's