Changeset 25047


Ignore:
Timestamp:
2011-01-19T16:56:27+01:00 (7 years ago)
Author:
blogic
Message:

[lantiq]

  • revert [25002]
  • fixes EBU ack when EBU causes an irq
Location:
trunk/target/linux/lantiq
Files:
1 deleted
1 edited

Legend:

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

    r25002 r25047  
    11--- a/arch/mips/Kconfig 
    22+++ b/arch/mips/Kconfig 
    3 @@ -139,6 +139,9 @@ config MACH_DECSTATION 
     3@@ -139,6 +139,9 @@ 
    44  
    55          otherwise choose R3000. 
     
    1111        bool "Jazz family of machines" 
    1212        select ARC 
    13 @@ -693,6 +696,7 @@ source "arch/mips/txx9/Kconfig" 
     13@@ -695,6 +698,7 @@ 
    1414 source "arch/mips/vr41xx/Kconfig" 
    1515 source "arch/mips/cavium-octeon/Kconfig" 
     
    2121--- a/arch/mips/Makefile 
    2222+++ b/arch/mips/Makefile 
    23 @@ -317,6 +317,17 @@ cflags-$(CONFIG_MIPS_COBALT)       += -I$(srct 
     23@@ -339,6 +339,17 @@ 
    2424 load-$(CONFIG_MIPS_COBALT)     += 0xffffffff80080000 
    2525  
     
    8484+obj-$(CONFIG_EARLY_PRINTK) += early_printk.o 
    8585--- /dev/null 
     86+++ b/arch/mips/lantiq/irq.c 
     87@@ -0,0 +1,218 @@ 
     88+/* 
     89+ *  This program is free software; you can redistribute it and/or modify it 
     90+ *  under the terms of the GNU General Public License version 2 as published 
     91+ *  by the Free Software Foundation. 
     92+ * 
     93+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org> 
     94+ */ 
     95+ 
     96+#include <linux/module.h> 
     97+#include <linux/interrupt.h> 
     98+ 
     99+#include <asm/bootinfo.h> 
     100+#include <asm/irq_cpu.h> 
     101+ 
     102+#include <lantiq.h> 
     103+#include <irq.h> 
     104+ 
     105+#define LQ_ICU_BASE_ADDR       (KSEG1 | 0x1F880200) 
     106+ 
     107+#define LQ_ICU_IM0_ISR         ((u32 *)(LQ_ICU_BASE_ADDR + 0x0000)) 
     108+#define LQ_ICU_IM0_IER         ((u32 *)(LQ_ICU_BASE_ADDR + 0x0008)) 
     109+#define LQ_ICU_IM0_IOSR                ((u32 *)(LQ_ICU_BASE_ADDR + 0x0010)) 
     110+#define LQ_ICU_IM0_IRSR                ((u32 *)(LQ_ICU_BASE_ADDR + 0x0018)) 
     111+#define LQ_ICU_IM0_IMR         ((u32 *)(LQ_ICU_BASE_ADDR + 0x0020)) 
     112+ 
     113+#define LQ_ICU_IM1_ISR         ((u32 *)(LQ_ICU_BASE_ADDR + 0x0028)) 
     114+#define LQ_ICU_IM2_ISR         ((u32 *)(LQ_ICU_BASE_ADDR + 0x0050)) 
     115+#define LQ_ICU_IM3_ISR         ((u32 *)(LQ_ICU_BASE_ADDR + 0x0078)) 
     116+#define LQ_ICU_IM4_ISR         ((u32 *)(LQ_ICU_BASE_ADDR + 0x00A0)) 
     117+ 
     118+#define LQ_ICU_OFFSET          (LQ_ICU_IM1_ISR - LQ_ICU_IM0_ISR) 
     119+ 
     120+#define LQ_EBU_BASE_ADDR       0xBE105300 
     121+#define LQ_EBU_PCC_ISTAT       ((u32 *)(LQ_EBU_BASE_ADDR + 0x00A0)) 
     122+ 
     123+void 
     124+lq_disable_irq(unsigned int irq_nr) 
     125+{ 
     126+       u32 *ier = LQ_ICU_IM0_IER; 
     127+       irq_nr -= INT_NUM_IRQ0; 
     128+       ier += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
     129+       irq_nr %= INT_NUM_IM_OFFSET; 
     130+       lq_w32(lq_r32(ier) & ~(1 << irq_nr), ier); 
     131+} 
     132+EXPORT_SYMBOL(lq_disable_irq); 
     133+ 
     134+void 
     135+lq_mask_and_ack_irq(unsigned int irq_nr) 
     136+{ 
     137+       u32 *ier = LQ_ICU_IM0_IER; 
     138+       u32 *isr = LQ_ICU_IM0_ISR; 
     139+       irq_nr -= INT_NUM_IRQ0; 
     140+       ier += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
     141+       isr += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
     142+       irq_nr %= INT_NUM_IM_OFFSET; 
     143+       lq_w32(lq_r32(ier) & ~(1 << irq_nr), ier); 
     144+       lq_w32((1 << irq_nr), isr); 
     145+} 
     146+EXPORT_SYMBOL(lq_mask_and_ack_irq); 
     147+ 
     148+static void 
     149+lq_ack_irq(unsigned int irq_nr) 
     150+{ 
     151+       u32 *isr = LQ_ICU_IM0_ISR; 
     152+       irq_nr -= INT_NUM_IRQ0; 
     153+       isr += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
     154+       irq_nr %= INT_NUM_IM_OFFSET; 
     155+       lq_w32((1 << irq_nr), isr); 
     156+} 
     157+ 
     158+void 
     159+lq_enable_irq(unsigned int irq_nr) 
     160+{ 
     161+       u32 *ier = LQ_ICU_IM0_IER; 
     162+       irq_nr -= INT_NUM_IRQ0; 
     163+       ier += LQ_ICU_OFFSET  * (irq_nr / INT_NUM_IM_OFFSET); 
     164+       irq_nr %= INT_NUM_IM_OFFSET; 
     165+       lq_w32(lq_r32(ier) | (1 << irq_nr), ier); 
     166+} 
     167+EXPORT_SYMBOL(lq_enable_irq); 
     168+ 
     169+static unsigned int 
     170+lq_startup_irq(unsigned int irq) 
     171+{ 
     172+       lq_enable_irq(irq); 
     173+       return 0; 
     174+} 
     175+ 
     176+static void 
     177+lq_end_irq(unsigned int irq) 
     178+{ 
     179+       if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
     180+               lq_enable_irq(irq); 
     181+} 
     182+ 
     183+static struct irq_chip 
     184+lq_irq_type = { 
     185+       "lq_irq", 
     186+       .startup = lq_startup_irq, 
     187+       .enable = lq_enable_irq, 
     188+       .disable = lq_disable_irq, 
     189+       .unmask = lq_enable_irq, 
     190+       .ack = lq_ack_irq, 
     191+       .mask = lq_disable_irq, 
     192+       .mask_ack = lq_mask_and_ack_irq, 
     193+       .end = lq_end_irq, 
     194+}; 
     195+ 
     196+static void 
     197+lq_hw_irqdispatch(int module) 
     198+{ 
     199+       u32 irq; 
     200+ 
     201+       irq = lq_r32(LQ_ICU_IM0_IOSR + (module * LQ_ICU_OFFSET)); 
     202+       if (irq == 0) 
     203+               return; 
     204+ 
     205+       /* silicon bug causes only the msb set to 1 to be valid. all 
     206+          other bits might be bogus */ 
     207+       irq = __fls(irq); 
     208+       do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module)); 
     209+       if ((irq == 22) && (module == 0)) 
     210+               lq_w32(lq_r32(LQ_EBU_PCC_ISTAT) | 0x10, 
     211+                       LQ_EBU_PCC_ISTAT); 
     212+} 
     213+ 
     214+#define DEFINE_HWx_IRQDISPATCH(x) \ 
     215+static void lq_hw ## x ## _irqdispatch(void)\ 
     216+{\ 
     217+       lq_hw_irqdispatch(x); \ 
     218+} 
     219+static void lq_hw5_irqdispatch(void) 
     220+{ 
     221+       do_IRQ(MIPS_CPU_TIMER_IRQ); 
     222+} 
     223+DEFINE_HWx_IRQDISPATCH(0) 
     224+DEFINE_HWx_IRQDISPATCH(1) 
     225+DEFINE_HWx_IRQDISPATCH(2) 
     226+DEFINE_HWx_IRQDISPATCH(3) 
     227+DEFINE_HWx_IRQDISPATCH(4) 
     228+/*DEFINE_HWx_IRQDISPATCH(5)*/ 
     229+ 
     230+asmlinkage void 
     231+plat_irq_dispatch(void) 
     232+{ 
     233+       unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; 
     234+       unsigned int i; 
     235+ 
     236+       if (pending & CAUSEF_IP7) 
     237+       { 
     238+               do_IRQ(MIPS_CPU_TIMER_IRQ); 
     239+               goto out; 
     240+       } else { 
     241+               for (i = 0; i < 5; i++) 
     242+               { 
     243+                       if (pending & (CAUSEF_IP2 << i)) 
     244+                       { 
     245+                               lq_hw_irqdispatch(i); 
     246+                               goto out; 
     247+                       } 
     248+               } 
     249+       } 
     250+       printk(KERN_ALERT "Spurious IRQ: CAUSE=0x%08x\n", read_c0_status()); 
     251+ 
     252+out: 
     253+       return; 
     254+} 
     255+ 
     256+static struct irqaction 
     257+cascade = { 
     258+       .handler = no_action, 
     259+       .flags = IRQF_DISABLED, 
     260+       .name = "cascade", 
     261+}; 
     262+ 
     263+void __init 
     264+arch_init_irq(void) 
     265+{ 
     266+       int i; 
     267+ 
     268+       for (i = 0; i < 5; i++) 
     269+               lq_w32(0, LQ_ICU_IM0_IER + (i * LQ_ICU_OFFSET)); 
     270+ 
     271+       mips_cpu_irq_init(); 
     272+ 
     273+       for (i = 2; i <= 6; i++) 
     274+               setup_irq(i, &cascade); 
     275+ 
     276+       if (cpu_has_vint) { 
     277+               printk(KERN_INFO "Setting up vectored interrupts\n"); 
     278+               set_vi_handler(2, lq_hw0_irqdispatch); 
     279+               set_vi_handler(3, lq_hw1_irqdispatch); 
     280+               set_vi_handler(4, lq_hw2_irqdispatch); 
     281+               set_vi_handler(5, lq_hw3_irqdispatch); 
     282+               set_vi_handler(6, lq_hw4_irqdispatch); 
     283+               set_vi_handler(7, lq_hw5_irqdispatch); 
     284+       } 
     285+ 
     286+       for (i = INT_NUM_IRQ0; i <= (INT_NUM_IRQ0 + (5 * INT_NUM_IM_OFFSET)); i++) 
     287+               set_irq_chip_and_handler(i, &lq_irq_type, 
     288+                       handle_level_irq); 
     289+ 
     290+       #if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC) 
     291+       set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | 
     292+               IE_IRQ3 | IE_IRQ4 | IE_IRQ5); 
     293+       #else 
     294+       set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 | 
     295+               IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5); 
     296+       #endif 
     297+} 
     298+ 
     299+void __cpuinit 
     300+arch_fixup_c0_irqs(void) 
     301+{ 
     302+       /* FIXME: check for CPUID and only do fix for specific chips/versions */ 
     303+       cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; 
     304+       cp0_perfcount_irq = CP0_LEGACY_PERFCNT_IRQ; 
     305+} 
     306--- /dev/null 
    86307+++ b/arch/mips/lantiq/setup.c 
    87308@@ -0,0 +1,47 @@ 
Note: See TracChangeset for help on using the changeset viewer.