Changeset 42510


Ignore:
Timestamp:
2014-09-12T08:53:58+02:00 (3 years ago)
Author:
blogic
Message:

atheros: rework chained interrupts handling

Call generic_handle_irq() instead of do_IRQ() for chained interrupts,
remove XXX_NONE interrupts and call spurious_interrupt() when an interrupt
is unexpected.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@…>

Location:
trunk/target/linux/atheros/patches-3.14
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/patches-3.14/100-board.patch

    r42509 r42510  
    660660--- /dev/null 
    661661+++ b/arch/mips/include/asm/mach-ar231x/ar2315_regs.h 
    662 @@ -0,0 +1,631 @@ 
     662@@ -0,0 +1,630 @@ 
    663663+/* 
    664664+ * Register definitions for AR2315+ 
     
    689689+ * Miscellaneous interrupts, which share IP2. 
    690690+ */ 
    691 +#define AR2315_MISC_IRQ_NONE           (AR231X_MISC_IRQ_BASE+0) 
    692 +#define AR2315_MISC_IRQ_UART0          (AR231X_MISC_IRQ_BASE+1) 
    693 +#define AR2315_MISC_IRQ_I2C_RSVD       (AR231X_MISC_IRQ_BASE+2) 
    694 +#define AR2315_MISC_IRQ_SPI            (AR231X_MISC_IRQ_BASE+3) 
    695 +#define AR2315_MISC_IRQ_AHB            (AR231X_MISC_IRQ_BASE+4) 
    696 +#define AR2315_MISC_IRQ_APB            (AR231X_MISC_IRQ_BASE+5) 
    697 +#define AR2315_MISC_IRQ_TIMER          (AR231X_MISC_IRQ_BASE+6) 
    698 +#define AR2315_MISC_IRQ_GPIO           (AR231X_MISC_IRQ_BASE+7) 
    699 +#define AR2315_MISC_IRQ_WATCHDOG       (AR231X_MISC_IRQ_BASE+8) 
    700 +#define AR2315_MISC_IRQ_IR_RSVD                (AR231X_MISC_IRQ_BASE+9) 
    701 +#define AR2315_MISC_IRQ_COUNT          10 
     691+#define AR2315_MISC_IRQ_UART0          (AR231X_MISC_IRQ_BASE+0) 
     692+#define AR2315_MISC_IRQ_I2C_RSVD       (AR231X_MISC_IRQ_BASE+1) 
     693+#define AR2315_MISC_IRQ_SPI            (AR231X_MISC_IRQ_BASE+2) 
     694+#define AR2315_MISC_IRQ_AHB            (AR231X_MISC_IRQ_BASE+3) 
     695+#define AR2315_MISC_IRQ_APB            (AR231X_MISC_IRQ_BASE+4) 
     696+#define AR2315_MISC_IRQ_TIMER          (AR231X_MISC_IRQ_BASE+5) 
     697+#define AR2315_MISC_IRQ_GPIO           (AR231X_MISC_IRQ_BASE+6) 
     698+#define AR2315_MISC_IRQ_WATCHDOG       (AR231X_MISC_IRQ_BASE+7) 
     699+#define AR2315_MISC_IRQ_IR_RSVD                (AR231X_MISC_IRQ_BASE+8) 
     700+#define AR2315_MISC_IRQ_COUNT          9 
    702701+ 
    703702+/* 
     
    12941293--- /dev/null 
    12951294+++ b/arch/mips/include/asm/mach-ar231x/ar5312_regs.h 
    1296 @@ -0,0 +1,249 @@ 
     1295@@ -0,0 +1,247 @@ 
    12971296+/* 
    12981297+ * This file is subject to the terms and conditions of the GNU General Public 
     
    13221321+ * Miscellaneous interrupts, which share IP6. 
    13231322+ */ 
    1324 +#define AR5312_MISC_IRQ_NONE           (AR231X_MISC_IRQ_BASE+0) 
    1325 +#define AR5312_MISC_IRQ_TIMER          (AR231X_MISC_IRQ_BASE+1) 
    1326 +#define AR5312_MISC_IRQ_AHB_PROC       (AR231X_MISC_IRQ_BASE+2) 
    1327 +#define AR5312_MISC_IRQ_AHB_DMA                (AR231X_MISC_IRQ_BASE+3) 
    1328 +#define AR5312_MISC_IRQ_GPIO           (AR231X_MISC_IRQ_BASE+4) 
    1329 +#define AR5312_MISC_IRQ_UART0          (AR231X_MISC_IRQ_BASE+5) 
    1330 +#define AR5312_MISC_IRQ_UART0_DMA      (AR231X_MISC_IRQ_BASE+6) 
    1331 +#define AR5312_MISC_IRQ_WATCHDOG       (AR231X_MISC_IRQ_BASE+7) 
    1332 +#define AR5312_MISC_IRQ_LOCAL          (AR231X_MISC_IRQ_BASE+8) 
    1333 +#define AR5312_MISC_IRQ_SPI            (AR231X_MISC_IRQ_BASE+9) 
    1334 +#define AR5312_MISC_IRQ_COUNT          10 
     1323+#define AR5312_MISC_IRQ_TIMER          (AR231X_MISC_IRQ_BASE+0) 
     1324+#define AR5312_MISC_IRQ_AHB_PROC       (AR231X_MISC_IRQ_BASE+1) 
     1325+#define AR5312_MISC_IRQ_AHB_DMA                (AR231X_MISC_IRQ_BASE+2) 
     1326+#define AR5312_MISC_IRQ_GPIO           (AR231X_MISC_IRQ_BASE+3) 
     1327+#define AR5312_MISC_IRQ_UART0          (AR231X_MISC_IRQ_BASE+4) 
     1328+#define AR5312_MISC_IRQ_UART0_DMA      (AR231X_MISC_IRQ_BASE+5) 
     1329+#define AR5312_MISC_IRQ_WATCHDOG       (AR231X_MISC_IRQ_BASE+6) 
     1330+#define AR5312_MISC_IRQ_LOCAL          (AR231X_MISC_IRQ_BASE+7) 
     1331+#define AR5312_MISC_IRQ_SPI            (AR231X_MISC_IRQ_BASE+8) 
     1332+#define AR5312_MISC_IRQ_COUNT          9 
    13351333+ 
    13361334+/* 
     
    13961394+ 
    13971395+/* AR5312_ISR register bit field definitions */ 
    1398 +#define AR5312_ISR_NONE                0x0000 
    13991396+#define AR5312_ISR_TIMER       0x0001 
    14001397+#define AR5312_ISR_AHBPROC     0x0002 
     
    15461543--- /dev/null 
    15471544+++ b/arch/mips/ar231x/ar5312.c 
    1548 @@ -0,0 +1,534 @@ 
     1545@@ -0,0 +1,536 @@ 
    15491546+/* 
    15501547+ * This file is subject to the terms and conditions of the GNU General Public 
     
    15921589+ 
    15931590+       if (ar231x_misc_intrs & AR5312_ISR_TIMER) { 
    1594 +               do_IRQ(AR5312_MISC_IRQ_TIMER); 
     1591+               generic_handle_irq(AR5312_MISC_IRQ_TIMER); 
    15951592+               (void)ar231x_read_reg(AR5312_TIMER); 
    15961593+       } else if (ar231x_misc_intrs & AR5312_ISR_AHBPROC) 
    1597 +               do_IRQ(AR5312_MISC_IRQ_AHB_PROC); 
     1594+               generic_handle_irq(AR5312_MISC_IRQ_AHB_PROC); 
    15981595+       else if ((ar231x_misc_intrs & AR5312_ISR_UART0)) 
    1599 +               do_IRQ(AR5312_MISC_IRQ_UART0); 
     1596+               generic_handle_irq(AR5312_MISC_IRQ_UART0); 
    16001597+       else if (ar231x_misc_intrs & AR5312_ISR_WD) 
    1601 +               do_IRQ(AR5312_MISC_IRQ_WATCHDOG); 
     1598+               generic_handle_irq(AR5312_MISC_IRQ_WATCHDOG); 
    16021599+       else 
    1603 +               do_IRQ(AR5312_MISC_IRQ_NONE); 
     1600+               spurious_interrupt(); 
    16041601+} 
    16051602+ 
     
    16211618+       else if (pending & CAUSEF_IP7) 
    16221619+               do_IRQ(AR231X_IRQ_CPU_CLOCK); 
     1620+       else 
     1621+               spurious_interrupt(); 
    16231622+} 
    16241623+ 
     
    16301629+ 
    16311630+       imr = ar231x_read_reg(AR5312_IMR); 
    1632 +       imr |= (1 << (d->irq - AR231X_MISC_IRQ_BASE - 1)); 
     1631+       imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE); 
    16331632+       ar231x_write_reg(AR5312_IMR, imr); 
    16341633+} 
     
    16411640+ 
    16421641+       imr = ar231x_read_reg(AR5312_IMR); 
    1643 +       imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE - 1)); 
     1642+       imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE)); 
    16441643+       ar231x_write_reg(AR5312_IMR, imr); 
    16451644+       ar231x_read_reg(AR5312_IMR); /* flush write buffer */ 
     
    20832082--- /dev/null 
    20842083+++ b/arch/mips/ar231x/ar2315.c 
    2085 @@ -0,0 +1,568 @@ 
     2084@@ -0,0 +1,570 @@ 
    20862085+/* 
    20872086+ * This file is subject to the terms and conditions of the GNU General Public 
     
    21482147+ 
    21492148+       if (bit >= 0) 
    2150 +               do_IRQ(AR231X_GPIO_IRQ_BASE + bit); 
     2149+               generic_handle_irq(AR231X_GPIO_IRQ_BASE + bit); 
    21512150+} 
    21522151+ 
     
    21572156+ 
    21582157+       if (misc_intr & AR2315_ISR_SPI) 
    2159 +               do_IRQ(AR2315_MISC_IRQ_SPI); 
     2158+               generic_handle_irq(AR2315_MISC_IRQ_SPI); 
    21602159+       else if (misc_intr & AR2315_ISR_TIMER) 
    2161 +               do_IRQ(AR2315_MISC_IRQ_TIMER); 
     2160+               generic_handle_irq(AR2315_MISC_IRQ_TIMER); 
    21622161+       else if (misc_intr & AR2315_ISR_AHB) 
    2163 +               do_IRQ(AR2315_MISC_IRQ_AHB); 
     2162+               generic_handle_irq(AR2315_MISC_IRQ_AHB); 
    21642163+       else if (misc_intr & AR2315_ISR_GPIO) 
    2165 +               do_IRQ(AR2315_MISC_IRQ_GPIO); 
     2164+               generic_handle_irq(AR2315_MISC_IRQ_GPIO); 
    21662165+       else if (misc_intr & AR2315_ISR_UART0) 
    2167 +               do_IRQ(AR2315_MISC_IRQ_UART0); 
     2166+               generic_handle_irq(AR2315_MISC_IRQ_UART0); 
    21682167+       else if (misc_intr & AR2315_ISR_WD) { 
    21692168+               ar231x_write_reg(AR2315_ISR, AR2315_ISR_WD); 
    2170 +               do_IRQ(AR2315_MISC_IRQ_WATCHDOG); 
     2169+               generic_handle_irq(AR2315_MISC_IRQ_WATCHDOG); 
    21712170+       } else 
    2172 +               do_IRQ(AR2315_MISC_IRQ_NONE); 
     2171+               spurious_interrupt(); 
    21732172+} 
    21742173+ 
     
    21942193+       else if (pending & CAUSEF_IP7) 
    21952194+               do_IRQ(AR231X_IRQ_CPU_CLOCK); 
     2195+       else 
     2196+               spurious_interrupt(); 
    21962197+} 
    21972198+ 
     
    22402241+ 
    22412242+       imr = ar231x_read_reg(AR2315_IMR); 
    2242 +       imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE - 1); 
     2243+       imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE); 
    22432244+       ar231x_write_reg(AR2315_IMR, imr); 
    22442245+} 
     
    22502251+ 
    22512252+       imr = ar231x_read_reg(AR2315_IMR); 
    2252 +       imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE - 1)); 
     2253+       imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE)); 
    22532254+       ar231x_write_reg(AR2315_IMR, imr); 
    22542255+} 
     
    27342735--- /dev/null 
    27352736+++ b/arch/mips/include/asm/mach-ar231x/ar231x.h 
    2736 @@ -0,0 +1,39 @@ 
     2737@@ -0,0 +1,38 @@ 
    27372738+#ifndef __ASM_MACH_AR231X_H 
    27382739+#define __ASM_MACH_AR231X_H 
     
    27452746+ 
    27462747+/* Software's idea of interrupts handled by "CPU Interrupt Controller" */ 
    2747 +#define AR231X_IRQ_NONE                (MIPS_CPU_IRQ_BASE+0) 
    27482748+#define AR231X_IRQ_CPU_CLOCK   (MIPS_CPU_IRQ_BASE+7) /* C0_CAUSE: 0x8000 */ 
    27492749+ 
  • trunk/target/linux/atheros/patches-3.14/105-ar2315_pci.patch

    r42509 r42510  
    383383                do_IRQ(AR2315_IRQ_MISC_INTRS); 
    384384        else if (pending & CAUSEF_IP7) 
    385 @@ -566,3 +570,18 @@ ar2315_plat_setup(void) 
     385@@ -568,3 +572,18 @@ ar2315_plat_setup(void) 
    386386        ar231x_serial_setup(AR2315_UART0, AR2315_MISC_IRQ_UART0, 
    387387                            ar2315_apb_frequency()); 
Note: See TracChangeset for help on using the changeset viewer.