Changeset 34552


Ignore:
Timestamp:
2012-12-06T23:40:02+01:00 (5 years ago)
Author:
florian
Message:

[adm8668] cleanup and make interrupt code more robust

Signed-off-by: Florian Fainelli <florian@…>

Location:
trunk/target/linux/adm8668/files/arch/mips
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/adm8668/files/arch/mips/adm8668/irq.c

    r34546 r34552  
    11/* 
    22 * Copyright (C) 2010 Scott Nicholas <neutronscott@scottn.us> 
     3 * Copyright (C) 2012 Florian Fainelli <florian@openwrt.org> 
    34 * 
    45 * This file is subject to the terms and conditions of the GNU General Public 
     
    2122#include <adm8668.h> 
    2223 
     24/* interrupt controller */ 
     25#define IRQ_STATUS_REG          0x00    /* Read */ 
     26#define IRQ_ENABLE_REG          0x08    /* Read/Write */ 
     27#define IRQ_DISABLE_REG         0x0C    /* Write */ 
     28 
     29#define IRQ_MASK                0xffff 
     30 
     31static inline void intc_write_reg(u32 val, unsigned int reg) 
     32{ 
     33        void __iomem *base = (void __iomem *)KSEG1ADDR(ADM8668_INTC_BASE); 
     34 
     35        __raw_writel(val, base + reg); 
     36} 
     37 
     38static inline u32 intc_read_reg(unsigned int reg) 
     39{ 
     40        void __iomem *base = (void __iomem *)KSEG1ADDR(ADM8668_INTC_BASE); 
     41 
     42        return __raw_readl(base + reg); 
     43} 
     44 
    2345static void adm8668_irq_cascade(void) 
    2446{ 
    25         int i; 
    26         unsigned long intsrc; 
     47        int irq; 
     48        u32 intsrc; 
    2749 
    28         intsrc = ADM8668_INTC_REG(IRQ_STATUS_REG) & IRQ_MASK; 
    29         for (i = 0; intsrc; intsrc >>= 1, i++) 
    30                 if (intsrc & 0x1) 
    31                         do_IRQ(i); 
     50        intsrc = intc_read_reg(IRQ_STATUS_REG) & IRQ_MASK; 
     51        if (intsrc) { 
     52                irq = fls(intsrc) - 1; 
     53                do_IRQ(irq); 
     54        } else 
     55                spurious_interrupt(); 
    3256} 
    3357 
     
    4468        if (pending & STATUSF_IP7) 
    4569                do_IRQ(MIPS_CPU_IRQ_BASE + 7); 
    46         if (pending & STATUSF_IP2) 
     70        else if (pending & STATUSF_IP2) 
    4771                adm8668_irq_cascade(); 
     72        else 
     73                spurious_interrupt(); 
    4874} 
    4975 
     
    5379static void enable_adm8668_irq(struct irq_data *d) 
    5480{ 
    55         ADM8668_INTC_REG(IRQ_ENABLE_REG) = (1 << d->irq); 
     81        intc_write_reg((1 << d->irq), IRQ_ENABLE_REG); 
    5682} 
    5783 
     
    5985static void ack_adm8668_irq(struct irq_data *d) 
    6086{ 
    61         ADM8668_INTC_REG(IRQ_DISABLE_REG) = (1 << d->irq); 
     87        intc_write_reg((1 << d->irq), IRQ_DISABLE_REG); 
    6288} 
    6389 
     
    80106        int i; 
    81107 
     108        /* disable all interrupts for the moment */ 
     109        intc_write_reg(IRQ_MASK, IRQ_DISABLE_REG); 
     110 
    82111        for (i = 0; i <= INT_LVL_MAX; i++) 
    83112                irq_set_chip_and_handler(i, &adm8668_irq_type, 
  • trunk/target/linux/adm8668/files/arch/mips/include/asm/mach-adm8668/adm8668.h

    r34550 r34552  
    3333#define ADM8668_UARTCLK_FREQ    62500000 
    3434 
    35 /* interrupt controller */ 
    36 #define IRQ_STATUS_REG          0x00    /* Read */ 
    37 #define IRQ_ENABLE_REG          0x08    /* Read/Write */ 
    38 #define IRQ_DISABLE_REG         0x0C    /* Write */ 
    39  
    4035/* interrupt levels */ 
    4136#define INT_LVL_SWI             1 
     
    5752 
    5853/* register access macros */ 
    59 #define ADM8668_INTC_REG(_reg)  \ 
    60         (*((volatile unsigned long *)(KSEG1ADDR(ADM8668_INTC_BASE + (_reg))))) 
    6154#define ADM8668_LAN_REG(_reg)           \ 
    6255        (*((volatile unsigned int *)(KSEG1ADDR(ADM8668_LAN_BASE + (_reg))))) 
  • trunk/target/linux/adm8668/files/arch/mips/include/asm/mach-adm8668/irq.h

    r25175 r34552  
    99#define __ASM_MACH_ADM8668_IRQ_H 
    1010 
    11 #define NR_IRQS 32 
     11#define NR_IRQS                 32 
    1212#define MIPS_CPU_IRQ_BASE       16 
    1313 
    14 #define IRQ_MASK                0xffff 
    15  
    1614#endif /* __ASM_MACH_ADM8668_IRQ_H */ 
Note: See TracChangeset for help on using the changeset viewer.