source: trunk/target/linux/ar71xx/patches-3.3/163-MIPS-ath79-add-IRQ-handling-code-for-the-QCA955X-SoC.patch @ 33335

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

ar71xx: fix CPU/DDR frequency calculation for SRIF PLLs on AR934x

File size: 6.9 KB
  • arch/mips/ath79/irq.c

    From 5d0de52f8e36916485a61b820916b71b5d918e6f Mon Sep 17 00:00:00 2001
    From: Gabor Juhos <juhosg@openwrt.org>
    Date: Sun, 24 Jun 2012 13:44:23 +0200
    Subject: [PATCH 19/34] MIPS: ath79: add IRQ handling code for the QCA955X SoCs
    
    Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
    ---
     arch/mips/ath79/irq.c                          |  110 ++++++++++++++++++++++--
     arch/mips/include/asm/mach-ath79/ar71xx_regs.h |   32 +++++++
     arch/mips/include/asm/mach-ath79/irq.h         |    9 ++-
     3 files changed, 142 insertions(+), 9 deletions(-)
    
    a b static void __init ath79_misc_irq_init(v 
    130130 
    131131        if (soc_is_ar71xx() || soc_is_ar913x()) 
    132132                ath79_misc_irq_chip.irq_mask_ack = ar71xx_misc_irq_mask; 
    133         else if (soc_is_ar724x() || soc_is_ar933x() || soc_is_ar934x()) 
     133        else if (soc_is_ar724x() || 
     134                 soc_is_ar933x() || 
     135                 soc_is_ar934x() || 
     136                 soc_is_qca955x()) 
    134137                ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack; 
    135138        else 
    136139                BUG(); 
    static void ar934x_ip2_irq_init(void) 
    177180        irq_set_chained_handler(ATH79_CPU_IRQ_IP2, ar934x_ip2_irq_dispatch); 
    178181} 
    179182 
     183static void qca955x_ip2_irq_dispatch(unsigned int irq, struct irq_desc *desc) 
     184{ 
     185        u32 status; 
     186 
     187        disable_irq_nosync(irq); 
     188 
     189        status = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS); 
     190        status &= QCA955X_EXT_INT_PCIE_RC1_ALL | QCA955X_EXT_INT_WMAC_ALL; 
     191 
     192        if (status == 0) { 
     193                spurious_interrupt(); 
     194                goto enable; 
     195        } 
     196 
     197        if (status & QCA955X_EXT_INT_PCIE_RC1_ALL) { 
     198                /* TODO: flush DDR? */ 
     199                generic_handle_irq(ATH79_IP2_IRQ(0)); 
     200        } 
     201 
     202        if (status & QCA955X_EXT_INT_WMAC_ALL) { 
     203                /* TODO: flsuh DDR? */ 
     204                generic_handle_irq(ATH79_IP2_IRQ(1)); 
     205        } 
     206 
     207enable: 
     208        enable_irq(irq); 
     209} 
     210 
     211static void qca955x_ip3_irq_dispatch(unsigned int irq, struct irq_desc *desc) 
     212{ 
     213        u32 status; 
     214 
     215        disable_irq_nosync(irq); 
     216 
     217        status = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS); 
     218        status &= QCA955X_EXT_INT_PCIE_RC2_ALL | 
     219                  QCA955X_EXT_INT_USB1 | 
     220                  QCA955X_EXT_INT_USB2; 
     221 
     222        if (status == 0) { 
     223                spurious_interrupt(); 
     224                goto enable; 
     225        } 
     226 
     227        if (status & QCA955X_EXT_INT_USB1) { 
     228                /* TODO: flush DDR? */ 
     229                generic_handle_irq(ATH79_IP3_IRQ(0)); 
     230        } 
     231 
     232        if (status & QCA955X_EXT_INT_USB2) { 
     233                /* TODO: flsuh DDR? */ 
     234                generic_handle_irq(ATH79_IP3_IRQ(1)); 
     235        } 
     236 
     237        if (status & QCA955X_EXT_INT_PCIE_RC2_ALL) { 
     238                /* TODO: flush DDR? */ 
     239                generic_handle_irq(ATH79_IP3_IRQ(2)); 
     240        } 
     241 
     242enable: 
     243        enable_irq(irq); 
     244} 
     245 
     246static void qca955x_irq_init(void) 
     247{ 
     248        int i; 
     249 
     250        for (i = ATH79_IP2_IRQ_BASE; 
     251             i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++) 
     252                irq_set_chip_and_handler(i, &dummy_irq_chip, 
     253                                         handle_level_irq); 
     254 
     255        irq_set_chained_handler(ATH79_CPU_IRQ_IP2, qca955x_ip2_irq_dispatch); 
     256 
     257        for (i = ATH79_IP3_IRQ_BASE; 
     258             i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++) 
     259                irq_set_chip_and_handler(i, &dummy_irq_chip, 
     260                                         handle_level_irq); 
     261 
     262        irq_set_chained_handler(ATH79_CPU_IRQ_IP3, qca955x_ip3_irq_dispatch); 
     263} 
     264 
    180265asmlinkage void plat_irq_dispatch(void) 
    181266{ 
    182267        unsigned long pending; 
    asmlinkage void plat_irq_dispatch(void) 
    212297 * Issue a flush in the handlers to ensure that the driver sees 
    213298 * the update. 
    214299 */ 
     300 
     301static void ath79_default_ip2_handler(void) 
     302{ 
     303        do_IRQ(ATH79_CPU_IRQ_IP2); 
     304} 
     305 
     306static void ath79_default_ip3_handler(void) 
     307{ 
     308        do_IRQ(ATH79_CPU_IRQ_USB); 
     309} 
     310 
    215311static void ar71xx_ip2_handler(void) 
    216312{ 
    217313        ath79_ddr_wb_flush(AR71XX_DDR_REG_FLUSH_PCI); 
    static void ar933x_ip2_handler(void) 
    236332        do_IRQ(ATH79_CPU_IRQ_IP2); 
    237333} 
    238334 
    239 static void ar934x_ip2_handler(void) 
    240 { 
    241         do_IRQ(ATH79_CPU_IRQ_IP2); 
    242 } 
    243  
    244335static void ar71xx_ip3_handler(void) 
    245336{ 
    246337        ath79_ddr_wb_flush(AR71XX_DDR_REG_FLUSH_USB); 
    void __init arch_init_irq(void) 
    286377                ath79_ip2_handler = ar933x_ip2_handler; 
    287378                ath79_ip3_handler = ar933x_ip3_handler; 
    288379        } else if (soc_is_ar934x()) { 
    289                 ath79_ip2_handler = ar934x_ip2_handler; 
     380                ath79_ip2_handler = ath79_default_ip2_handler; 
    290381                ath79_ip3_handler = ar934x_ip3_handler; 
     382        } else if (soc_is_qca955x()) { 
     383                ath79_ip2_handler = ath79_default_ip2_handler; 
     384                ath79_ip3_handler = ath79_default_ip3_handler; 
    291385        } else { 
    292386                BUG(); 
    293387        } 
    void __init arch_init_irq(void) 
    298392 
    299393        if (soc_is_ar934x()) 
    300394                ar934x_ip2_irq_init(); 
     395        else if (soc_is_qca955x()) 
     396                qca955x_irq_init(); 
    301397} 
  • arch/mips/include/asm/mach-ath79/ar71xx_regs.h

    a b  
    300300#define AR934X_RESET_REG_PCIE_WMAC_INT_STATUS   0xac 
    301301 
    302302#define QCA955X_RESET_REG_BOOTSTRAP             0xb0 
     303#define QCA955X_RESET_REG_EXT_INT_STATUS        0xac 
    303304 
    304305#define MISC_INT_ETHSW                  BIT(12) 
    305306#define MISC_INT_TIMER4                 BIT(10) 
     
    398399         AR934X_PCIE_WMAC_INT_PCIE_RC1 | AR934X_PCIE_WMAC_INT_PCIE_RC2 | \ 
    399400         AR934X_PCIE_WMAC_INT_PCIE_RC3) 
    400401 
     402#define QCA955X_EXT_INT_WMAC_MISC               BIT(0) 
     403#define QCA955X_EXT_INT_WMAC_TX                 BIT(1) 
     404#define QCA955X_EXT_INT_WMAC_RXLP               BIT(2) 
     405#define QCA955X_EXT_INT_WMAC_RXHP               BIT(3) 
     406#define QCA955X_EXT_INT_PCIE_RC1                BIT(4) 
     407#define QCA955X_EXT_INT_PCIE_RC1_INT0           BIT(5) 
     408#define QCA955X_EXT_INT_PCIE_RC1_INT1           BIT(6) 
     409#define QCA955X_EXT_INT_PCIE_RC1_INT2           BIT(7) 
     410#define QCA955X_EXT_INT_PCIE_RC1_INT3           BIT(8) 
     411#define QCA955X_EXT_INT_PCIE_RC2                BIT(12) 
     412#define QCA955X_EXT_INT_PCIE_RC2_INT0           BIT(13) 
     413#define QCA955X_EXT_INT_PCIE_RC2_INT1           BIT(14) 
     414#define QCA955X_EXT_INT_PCIE_RC2_INT2           BIT(15) 
     415#define QCA955X_EXT_INT_PCIE_RC2_INT3           BIT(16) 
     416#define QCA955X_EXT_INT_USB1                    BIT(24) 
     417#define QCA955X_EXT_INT_USB2                    BIT(28) 
     418 
     419#define QCA955X_EXT_INT_WMAC_ALL \ 
     420        (QCA955X_EXT_INT_WMAC_MISC | QCA955X_EXT_INT_WMAC_TX | \ 
     421         QCA955X_EXT_INT_WMAC_RXLP | QCA955X_EXT_INT_WMAC_RXHP) 
     422 
     423#define QCA955X_EXT_INT_PCIE_RC1_ALL \ 
     424        (QCA955X_EXT_INT_PCIE_RC1 | QCA955X_EXT_INT_PCIE_RC1_INT0 | \ 
     425         QCA955X_EXT_INT_PCIE_RC1_INT1 | QCA955X_EXT_INT_PCIE_RC1_INT2 | \ 
     426         QCA955X_EXT_INT_PCIE_RC1_INT3) 
     427 
     428#define QCA955X_EXT_INT_PCIE_RC2_ALL \ 
     429        (QCA955X_EXT_INT_PCIE_RC2 | QCA955X_EXT_INT_PCIE_RC2_INT0 | \ 
     430         QCA955X_EXT_INT_PCIE_RC2_INT1 | QCA955X_EXT_INT_PCIE_RC2_INT2 | \ 
     431         QCA955X_EXT_INT_PCIE_RC2_INT3) 
     432 
    401433#define REV_ID_MAJOR_MASK               0xfff0 
    402434#define REV_ID_MAJOR_AR71XX             0x00a0 
    403435#define REV_ID_MAJOR_AR913X             0x00b0 
  • arch/mips/include/asm/mach-ath79/irq.h

    a b  
    1010#define __ASM_MACH_ATH79_IRQ_H 
    1111 
    1212#define MIPS_CPU_IRQ_BASE       0 
    13 #define NR_IRQS                 48 
     13#define NR_IRQS                 51 
    1414 
    1515#define ATH79_MISC_IRQ_BASE     8 
    1616#define ATH79_MISC_IRQ_COUNT    32 
     
    2323#define ATH79_IP2_IRQ_COUNT     2 
    2424#define ATH79_IP2_IRQ(_x)       (ATH79_IP2_IRQ_BASE + (_x)) 
    2525 
     26#define ATH79_IP3_IRQ_BASE      (ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT) 
     27#define ATH79_IP3_IRQ_COUNT     3 
     28#define ATH79_IP3_IRQ(_x)       (ATH79_IP3_IRQ_BASE + (_x)) 
     29 
    2630#define ATH79_CPU_IRQ_IP2       (MIPS_CPU_IRQ_BASE + 2) 
    27 #define ATH79_CPU_IRQ_USB       (MIPS_CPU_IRQ_BASE + 3) 
     31#define ATH79_CPU_IRQ_IP3       (MIPS_CPU_IRQ_BASE + 3) 
     32#define ATH79_CPU_IRQ_USB       ATH79_CPU_IRQ_IP3 
    2833#define ATH79_CPU_IRQ_GE0       (MIPS_CPU_IRQ_BASE + 4) 
    2934#define ATH79_CPU_IRQ_GE1       (MIPS_CPU_IRQ_BASE + 5) 
    3035#define ATH79_CPU_IRQ_MISC      (MIPS_CPU_IRQ_BASE + 6) 
Note: See TracBrowser for help on using the repository browser.