source: trunk/target/linux/ar71xx/patches-3.3/117-MIPS-ath79-allow-to-use-SoC-specific-PCI-IRQ-maps.patch @ 30410

Last change on this file since 30410 was 30410, checked in by juhosg, 4 years ago

ar71xx: add preliminary support for 3.3

File size: 4.2 KB
  • arch/mips/ath79/pci.c

    From 8a1a5852aa7f8cfc027b2b0bb51cbbac4309e144 Mon Sep 17 00:00:00 2001
    From: Gabor Juhos <juhosg@openwrt.org>
    Date: Sun, 20 Nov 2011 14:32:09 +0100
    Subject: [PATCH 17/35] 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 <juhosg@openwrt.org>
    
    v2: - no changes
    ---
     arch/mips/ath79/pci.c |   72 ++++++++++++++++++++++++++++++++++++++++++++++---
     arch/mips/ath79/pci.h |    9 ++++++
     2 files changed, 77 insertions(+), 4 deletions(-)
    
    a b  
    88 *  by the Free Software Foundation. 
    99 */ 
    1010 
     11#include <linux/init.h> 
    1112#include <linux/pci.h> 
    1213#include <asm/mach-ath79/ath79.h> 
    1314#include <asm/mach-ath79/irq.h> 
     
    1516#include "pci.h" 
    1617 
    1718static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev); 
     19static const struct ath79_pci_irq *ath79_pci_irq_map __initdata; 
     20static unsigned ath79_pci_nr_irqs __initdata; 
    1821static struct ar724x_pci_data *pci_data; 
    1922static int pci_data_size; 
    2023 
     24static const struct ath79_pci_irq ar71xx_pci_irq_map[] __initconst = { 
     25        { 
     26                .slot   = 17, 
     27                .pin    = 1, 
     28                .irq    = ATH79_PCI_IRQ(0), 
     29        }, { 
     30                .slot   = 18, 
     31                .pin    = 1, 
     32                .irq    = ATH79_PCI_IRQ(1), 
     33        }, { 
     34                .slot   = 19, 
     35                .pin    = 1, 
     36                .irq    = ATH79_PCI_IRQ(2), 
     37        } 
     38}; 
     39 
     40static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = { 
     41        { 
     42                .slot   = 0, 
     43                .pin    = 1, 
     44                .irq    = ATH79_PCI_IRQ(0), 
     45        } 
     46}; 
     47 
    2148void ar724x_pci_add_data(struct ar724x_pci_data *data, int size) 
    2249{ 
    2350        pci_data        = data; 
    void ar724x_pci_add_data(struct ar724x_p 
    2653 
    2754int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin) 
    2855{ 
    29         unsigned int devfn = dev->devfn; 
    3056        int irq = -1; 
     57        int i; 
    3158 
    32         if (devfn > pci_data_size - 1) 
    33                 return irq; 
    34  
    35         irq = pci_data[devfn].irq; 
     59        if (ath79_pci_nr_irqs == 0 || 
     60            ath79_pci_irq_map == NULL) { 
     61                if (soc_is_ar71xx()) { 
     62                        ath79_pci_irq_map = ar71xx_pci_irq_map; 
     63                        ath79_pci_nr_irqs = ARRAY_SIZE(ar71xx_pci_irq_map); 
     64                } else if (soc_is_ar724x()) { 
     65                        ath79_pci_irq_map = ar724x_pci_irq_map; 
     66                        ath79_pci_nr_irqs = ARRAY_SIZE(ar724x_pci_irq_map); 
     67                } else { 
     68                        pr_crit("pci %s: invalid irq map\n", 
     69                                pci_name((struct pci_dev *) dev)); 
     70                        return irq; 
     71                } 
     72        } 
     73 
     74        for (i = 0; i < ath79_pci_nr_irqs; i++) { 
     75                const struct ath79_pci_irq *entry; 
     76 
     77                entry = &ath79_pci_irq_map[i]; 
     78                if (entry->slot == slot && entry->pin == pin) { 
     79                        irq = entry->irq; 
     80                        break; 
     81                } 
     82        } 
     83 
     84        if (irq < 0) 
     85                pr_crit("pci %s: no irq found for pin %u\n", 
     86                        pci_name((struct pci_dev *) dev), pin); 
     87        else 
     88                pr_info("pci %s: using irq %d for pin %u\n", 
     89                        pci_name((struct pci_dev *) dev), irq, pin); 
    3690 
    3791        return irq; 
    3892} 
    int pcibios_plat_dev_init(struct pci_dev 
    4599        return 0; 
    46100} 
    47101 
     102void __init ath79_pci_set_irq_map(unsigned nr_irqs, 
     103                                  const struct ath79_pci_irq *map) 
     104{ 
     105        ath79_pci_nr_irqs = nr_irqs; 
     106        ath79_pci_irq_map = map; 
     107} 
     108 
    48109void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)) 
    49110{ 
    50111        ath79_pci_plat_dev_init = func; 
    void __init ath79_pci_set_plat_dev_init( 
    52113 
    53114int __init ath79_register_pci(void) 
    54115{ 
     116        if (soc_is_ar71xx()) 
     117                return ar71xx_pcibios_init(); 
     118 
    55119        if (soc_is_ar724x()) 
    56120                return ar724x_pcibios_init(ATH79_CPU_IRQ_IP2); 
    57121 
  • arch/mips/ath79/pci.h

    a b struct ar724x_pci_data { 
    1515        int irq; 
    1616}; 
    1717 
     18struct ath79_pci_irq { 
     19        u8      slot; 
     20        u8      pin; 
     21        int     irq; 
     22}; 
     23 
    1824void ar724x_pci_add_data(struct ar724x_pci_data *data, int size); 
    1925 
    2026#ifdef CONFIG_PCI 
     27void ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map); 
    2128void ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev)); 
    2229int ath79_register_pci(void); 
    2330#else 
    2431static inline void 
     32ath79_pci_set_irq_map(unsigned nr_irqs, const struct ath79_pci_irq *map) {} 
     33static inline void 
    2534ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *)) {} 
    2635static inline int ath79_register_pci(void) { return 0; } 
    2736#endif 
Note: See TracBrowser for help on using the repository browser.