Changeset 25002


Ignore:
Timestamp:
2011-01-15T04:32:16+01:00 (7 years ago)
Author:
mirko
Message:

[lantiq] move irq.c from patch into own file

Location:
trunk/target/linux/lantiq
Files:
5 added
1 edited

Legend:

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

    r24526 r25002  
    8484+obj-$(CONFIG_EARLY_PRINTK) += early_printk.o 
    8585--- /dev/null 
    86 +++ b/arch/mips/lantiq/irq.c 
    87 @@ -0,0 +1,212 @@ 
    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 +void 
    121 +lq_disable_irq(unsigned int irq_nr) 
    122 +{ 
    123 +       u32 *ier = LQ_ICU_IM0_IER; 
    124 +       irq_nr -= INT_NUM_IRQ0; 
    125 +       ier += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
    126 +       irq_nr %= INT_NUM_IM_OFFSET; 
    127 +       lq_w32(lq_r32(ier) & ~(1 << irq_nr), ier); 
    128 +} 
    129 +EXPORT_SYMBOL(lq_disable_irq); 
    130 + 
    131 +void 
    132 +lq_mask_and_ack_irq(unsigned int irq_nr) 
    133 +{ 
    134 +       u32 *ier = LQ_ICU_IM0_IER; 
    135 +       u32 *isr = LQ_ICU_IM0_ISR; 
    136 +       irq_nr -= INT_NUM_IRQ0; 
    137 +       ier += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
    138 +       isr += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
    139 +       irq_nr %= INT_NUM_IM_OFFSET; 
    140 +       lq_w32(lq_r32(ier) & ~(1 << irq_nr), ier); 
    141 +       lq_w32((1 << irq_nr), isr); 
    142 +} 
    143 +EXPORT_SYMBOL(lq_mask_and_ack_irq); 
    144 + 
    145 +static void 
    146 +lq_ack_irq(unsigned int irq_nr) 
    147 +{ 
    148 +       u32 *isr = LQ_ICU_IM0_ISR; 
    149 +       irq_nr -= INT_NUM_IRQ0; 
    150 +       isr += LQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET); 
    151 +       irq_nr %= INT_NUM_IM_OFFSET; 
    152 +       lq_w32((1 << irq_nr), isr); 
    153 +} 
    154 + 
    155 +void 
    156 +lq_enable_irq(unsigned int irq_nr) 
    157 +{ 
    158 +       u32 *ier = LQ_ICU_IM0_IER; 
    159 +       irq_nr -= INT_NUM_IRQ0; 
    160 +       ier += LQ_ICU_OFFSET  * (irq_nr / INT_NUM_IM_OFFSET); 
    161 +       irq_nr %= INT_NUM_IM_OFFSET; 
    162 +       lq_w32(lq_r32(ier) | (1 << irq_nr), ier); 
    163 +} 
    164 +EXPORT_SYMBOL(lq_enable_irq); 
    165 + 
    166 +static unsigned int 
    167 +lq_startup_irq(unsigned int irq) 
    168 +{ 
    169 +       lq_enable_irq(irq); 
    170 +       return 0; 
    171 +} 
    172 + 
    173 +static void 
    174 +lq_end_irq(unsigned int irq) 
    175 +{ 
    176 +       if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) 
    177 +               lq_enable_irq(irq); 
    178 +} 
    179 + 
    180 +static struct irq_chip 
    181 +lq_irq_type = { 
    182 +       "lq_irq", 
    183 +       .startup = lq_startup_irq, 
    184 +       .enable = lq_enable_irq, 
    185 +       .disable = lq_disable_irq, 
    186 +       .unmask = lq_enable_irq, 
    187 +       .ack = lq_ack_irq, 
    188 +       .mask = lq_disable_irq, 
    189 +       .mask_ack = lq_mask_and_ack_irq, 
    190 +       .end = lq_end_irq, 
    191 +}; 
    192 + 
    193 +static void 
    194 +lq_hw_irqdispatch(int module) 
    195 +{ 
    196 +       u32 irq; 
    197 + 
    198 +       irq = lq_r32(LQ_ICU_IM0_IOSR + (module * LQ_ICU_OFFSET)); 
    199 +       if (irq == 0) 
    200 +               return; 
    201 + 
    202 +       /* silicon bug causes only the msb set to 1 to be valid. all 
    203 +          other bits might be bogus */ 
    204 +       irq = __fls(irq); 
    205 +       do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module)); 
    206 +} 
    207 + 
    208 +#define DEFINE_HWx_IRQDISPATCH(x) \ 
    209 +static void lq_hw ## x ## _irqdispatch(void)\ 
    210 +{\ 
    211 +       lq_hw_irqdispatch(x); \ 
    212 +} 
    213 +static void lq_hw5_irqdispatch(void) 
    214 +{ 
    215 +       do_IRQ(MIPS_CPU_TIMER_IRQ); 
    216 +} 
    217 +DEFINE_HWx_IRQDISPATCH(0) 
    218 +DEFINE_HWx_IRQDISPATCH(1) 
    219 +DEFINE_HWx_IRQDISPATCH(2) 
    220 +DEFINE_HWx_IRQDISPATCH(3) 
    221 +DEFINE_HWx_IRQDISPATCH(4) 
    222 +/*DEFINE_HWx_IRQDISPATCH(5)*/ 
    223 + 
    224 +asmlinkage void 
    225 +plat_irq_dispatch(void) 
    226 +{ 
    227 +       unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM; 
    228 +       unsigned int i; 
    229 + 
    230 +       if (pending & CAUSEF_IP7) 
    231 +       { 
    232 +               do_IRQ(MIPS_CPU_TIMER_IRQ); 
    233 +               goto out; 
    234 +       } else { 
    235 +               for (i = 0; i < 5; i++) 
    236 +               { 
    237 +                       if (pending & (CAUSEF_IP2 << i)) 
    238 +                       { 
    239 +                               lq_hw_irqdispatch(i); 
    240 +                               goto out; 
    241 +                       } 
    242 +               } 
    243 +       } 
    244 +       printk(KERN_ALERT "Spurious IRQ: CAUSE=0x%08x\n", read_c0_status()); 
    245 + 
    246 +out: 
    247 +       return; 
    248 +} 
    249 + 
    250 +static struct irqaction 
    251 +cascade = { 
    252 +       .handler = no_action, 
    253 +       .flags = IRQF_DISABLED, 
    254 +       .name = "cascade", 
    255 +}; 
    256 + 
    257 +void __init 
    258 +arch_init_irq(void) 
    259 +{ 
    260 +       int i; 
    261 + 
    262 +       for (i = 0; i < 5; i++) 
    263 +               lq_w32(0, LQ_ICU_IM0_IER + (i * LQ_ICU_OFFSET)); 
    264 + 
    265 +       mips_cpu_irq_init(); 
    266 + 
    267 +       for (i = 2; i <= 6; i++) 
    268 +               setup_irq(i, &cascade); 
    269 + 
    270 +       if (cpu_has_vint) { 
    271 +               printk(KERN_INFO "Setting up vectored interrupts\n"); 
    272 +               set_vi_handler(2, lq_hw0_irqdispatch); 
    273 +               set_vi_handler(3, lq_hw1_irqdispatch); 
    274 +               set_vi_handler(4, lq_hw2_irqdispatch); 
    275 +               set_vi_handler(5, lq_hw3_irqdispatch); 
    276 +               set_vi_handler(6, lq_hw4_irqdispatch); 
    277 +               set_vi_handler(7, lq_hw5_irqdispatch); 
    278 +       } 
    279 + 
    280 +       for (i = INT_NUM_IRQ0; i <= (INT_NUM_IRQ0 + (5 * INT_NUM_IM_OFFSET)); i++) 
    281 +               set_irq_chip_and_handler(i, &lq_irq_type, 
    282 +                       handle_level_irq); 
    283 + 
    284 +       #if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC) 
    285 +       set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | 
    286 +               IE_IRQ3 | IE_IRQ4 | IE_IRQ5); 
    287 +       #else 
    288 +       set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 | 
    289 +               IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5); 
    290 +       #endif 
    291 +} 
    292 + 
    293 +void __cpuinit 
    294 +arch_fixup_c0_irqs(void) 
    295 +{ 
    296 +       /* FIXME: check for CPUID and only do fix for specific chips/versions */ 
    297 +       cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; 
    298 +       cp0_perfcount_irq = CP0_LEGACY_PERFCNT_IRQ; 
    299 +} 
    300 --- /dev/null 
    30186+++ b/arch/mips/lantiq/setup.c 
    30287@@ -0,0 +1,47 @@ 
Note: See TracChangeset for help on using the changeset viewer.