summaryrefslogtreecommitdiff
path: root/target/linux/brcm47xx/patches-3.3/044-bcma-add-PCIe-host-controller.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/brcm47xx/patches-3.3/044-bcma-add-PCIe-host-controller.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.3/044-bcma-add-PCIe-host-controller.patch76
1 files changed, 76 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.3/044-bcma-add-PCIe-host-controller.patch b/target/linux/brcm47xx/patches-3.3/044-bcma-add-PCIe-host-controller.patch
new file mode 100644
index 0000000..e574069
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.3/044-bcma-add-PCIe-host-controller.patch
@@ -0,0 +1,76 @@
+--- a/arch/mips/pci/pci-bcm47xx.c
++++ b/arch/mips/pci/pci-bcm47xx.c
+@@ -25,6 +25,7 @@
+ #include <linux/types.h>
+ #include <linux/pci.h>
+ #include <linux/ssb/ssb.h>
++#include <linux/bcma/bcma.h>
+ #include <bcm47xx.h>
+
+ int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+@@ -32,15 +33,12 @@ int __init pcibios_map_irq(const struct
+ return 0;
+ }
+
+-int pcibios_plat_dev_init(struct pci_dev *dev)
+-{
+ #ifdef CONFIG_BCM47XX_SSB
++static int bcm47xx_pcibios_plat_dev_init_ssb(struct pci_dev *dev)
++{
+ int res;
+ u8 slot, pin;
+
+- if (bcm47xx_bus_type != BCM47XX_BUS_TYPE_SSB)
+- return 0;
+-
+ res = ssb_pcibios_plat_dev_init(dev);
+ if (res < 0) {
+ printk(KERN_ALERT "PCI: Failed to init device %s\n",
+@@ -60,6 +58,47 @@ int pcibios_plat_dev_init(struct pci_dev
+ }
+
+ dev->irq = res;
++ return 0;
++}
+ #endif
++
++#ifdef CONFIG_BCM47XX_BCMA
++static int bcm47xx_pcibios_plat_dev_init_bcma(struct pci_dev *dev)
++{
++ int res;
++
++ res = bcma_core_pci_plat_dev_init(dev);
++ if (res < 0) {
++ printk(KERN_ALERT "PCI: Failed to init device %s\n",
++ pci_name(dev));
++ return res;
++ }
++
++ res = bcma_core_pci_pcibios_map_irq(dev);
++
++ /* IRQ-0 and IRQ-1 are software interrupts. */
++ if (res < 2) {
++ printk(KERN_ALERT "PCI: Failed to map IRQ of device %s\n",
++ pci_name(dev));
++ return res;
++ }
++
++ dev->irq = res;
+ return 0;
+ }
++#endif
++
++int pcibios_plat_dev_init(struct pci_dev *dev)
++{
++#ifdef CONFIG_BCM47XX_SSB
++ if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_SSB)
++ return bcm47xx_pcibios_plat_dev_init_ssb(dev);
++ else
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++ if (bcm47xx_bus_type == BCM47XX_BUS_TYPE_BCMA)
++ return bcm47xx_pcibios_plat_dev_init_bcma(dev);
++ else
++#endif
++ return 0;
++}