X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=target%2Flinux%2Far71xx%2Fpatches-3.3%2F115-MIPS-ath79-allow-to-use-SoC-specific-PCI-IRQ-maps.patch;fp=target%2Flinux%2Far71xx%2Fpatches-3.3%2F115-MIPS-ath79-allow-to-use-SoC-specific-PCI-IRQ-maps.patch;h=0000000000000000000000000000000000000000;hp=7daaf1923b1403a83368a6710a33322914071bfe;hb=501d90c5bd477f4fca0e39df15de1596592a0563;hpb=8a0b2153784c5819938347f13fbe627f976eae19 diff --git a/target/linux/ar71xx/patches-3.3/115-MIPS-ath79-allow-to-use-SoC-specific-PCI-IRQ-maps.patch b/target/linux/ar71xx/patches-3.3/115-MIPS-ath79-allow-to-use-SoC-specific-PCI-IRQ-maps.patch deleted file mode 100644 index 7daaf1923b..0000000000 --- a/target/linux/ar71xx/patches-3.3/115-MIPS-ath79-allow-to-use-SoC-specific-PCI-IRQ-maps.patch +++ /dev/null @@ -1,165 +0,0 @@ -From fd1dd2f2c317bc0fc2c30fba440d911654bf592e Mon Sep 17 00:00:00 2001 -From: Gabor Juhos -Date: Wed, 14 Mar 2012 10:36:11 +0100 -Subject: [PATCH 20/47] MIPS: ath79: allow to use SoC specific PCI IRQ maps - -The PCI controllers in the AR71XX and in the -AR724X SoCs are different, and both of them -uses different IRQ wiring. - -The patch modifies the 'pcibios_map_irq' function -in order to allow to use different IRQ maps for -the different SoCs. The patch also adds a function, -which lets the board setup code to override the -default IRQ map. - -Signed-off-by: Gabor Juhos -Cc: linux-mips@linux-mips.org -Patchwork: https://patchwork.linux-mips.org/patch/3500/ -Signed-off-by: Ralf Baechle ---- - arch/mips/ath79/pci.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++--- - arch/mips/ath79/pci.h | 9 ++++++ - 2 files changed, 77 insertions(+), 4 deletions(-) - ---- a/arch/mips/ath79/pci.c -+++ b/arch/mips/ath79/pci.c -@@ -8,6 +8,7 @@ - * by the Free Software Foundation. - */ - -+#include - #include - #include - #include -@@ -15,9 +16,35 @@ - #include "pci.h" - - static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev); -+static const struct ath79_pci_irq *ath79_pci_irq_map __initdata; -+static unsigned ath79_pci_nr_irqs __initdata; - static struct ar724x_pci_data *pci_data; - static int pci_data_size; - -+static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = { -+ { -+ .slot = 17, -+ .pin = 1, -+ .irq = ATH79_PCI_IRQ(0), -+ }, { -+ .slot = 18, -+ .pin = 1, -+ .irq = ATH79_PCI_IRQ(1), -+ }, { -+ .slot = 19, -+ .pin = 1, -+ .irq = ATH79_PCI_IRQ(2), -+ } -+}; -+ -+static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = { -+ { -+ .slot = 0, -+ .pin = 1, -+ .irq = ATH79_PCI_IRQ(0), -+ } -+}; -+ - void ar724x_pci_add_data(struct ar724x_pci_data *data, int size) - { - pci_data = data; -@@ -26,13 +53,40 @@ void ar724x_pci_add_data(struct ar724x_p - - int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin) - { -- unsigned int devfn = dev->devfn; - int irq = -1; -+ int i; - -- if (devfn > pci_data_size - 1) -- return irq; -- -- irq = pci_data[devfn].irq; -+ if (ath79_pci_nr_irqs == 0 || -+ ath79_pci_irq_map == NULL) { -+ if (soc_is_ar71xx()) { -+ ath79_pci_irq_map = ar71xx_pci_irq_map; -+ ath79_pci_nr_irqs = ARRAY_SIZE(ar71xx_pci_irq_map); -+ } else if (soc_is_ar724x()) { -+ ath79_pci_irq_map = ar724x_pci_irq_map; -+ ath79_pci_nr_irqs = ARRAY_SIZE(ar724x_pci_irq_map); -+ } else { -+ pr_crit("pci %s: invalid irq map\n", -+ pci_name((struct pci_dev *) dev)); -+ return irq; -+ } -+ } -+ -+ for (i = 0; i < ath79_pci_nr_irqs; i++) { -+ const struct ath79_pci_irq *entry; -+ -+ entry = &ath79_pci_irq_map[i]; -+ if (entry->slot == slot && entry->pin == pin) { -+ irq = entry->irq; -+ break; -+ } -+ } -+ -+ if (irq < 0) -+ pr_crit("pci %s: no irq found for pin %u\n", -+ pci_name((struct pci_dev *) dev), pin); -+ else -+ pr_info("pci %s: using irq %d for pin %u\n", -+ pci_name((struct pci_dev *) dev), irq, pin); - - return irq; - } -@@ -45,6 +99,13 @@ int pcibios_plat_dev_init(struct pci_dev - return 0; - } - -+void __init ath79_pci_set_irq_map(unsigned nr_irqs, -+ const struct ath79_pci_irq *map) -+{ -+ ath79_pci_nr_irqs = nr_irqs; -+ ath79_pci_irq_map = map; -+} -+ - void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)) - { - ath79_pci_plat_dev_init = func; -@@ -52,6 +113,9 @@ void __init ath79_pci_set_plat_dev_init( - - int __init ath79_register_pci(void) - { -+ if (soc_is_ar71xx()) -+ return ar71xx_pcibios_init(); -+ - if (soc_is_ar724x()) - return ar724x_pcibios_init(ATH79_CPU_IRQ_IP2); - ---- a/arch/mips/ath79/pci.h -+++ b/arch/mips/ath79/pci.h -@@ -15,13 +15,22 @@ struct ar724x_pci_data { - int irq; - }; - -+struct ath79_pci_irq { -+ u8 slot; -+ u8 pin; -+ int irq; -+}; -+ - void ar724x_pci_add_data(struct ar724x_pci_data *data, int size); - - #ifdef CONFIG_PCI -+void ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map); - void ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)); - int ath79_register_pci(void); - #else - static inline void -+ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map) {} -+static inline void - ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *)) {} - static inline int ath79_register_pci(void) { return 0; } - #endif