--- zzzz-none-000/linux-2.6.19.2/arch/arm/kernel/irq.c 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/arch/arm/kernel/irq.c 2007-06-28 13:54:53.000000000 +0000 @@ -40,6 +40,15 @@ #include #include +#if defined(CONFIG_CHECK_IDLE) +#include +#endif /*--- #if CONFIG_CHECK_IDLE ---*/ +#if defined(CONFIG_AVM_SIMPLE_PROFILING) +#include +#include +#include +#include +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ /* * No architecture-specific irq_finish function defined in arm/arch/irqs.h. @@ -104,6 +113,8 @@ .lock = SPIN_LOCK_UNLOCKED }; +/*------------------------------------------------------------------------------------------*\ +\*------------------------------------------------------------------------------------------*/ /* * do_IRQ handles all hardware IRQ's. Decoded IRQs should not * come via this function. Instead, they should provide their @@ -114,6 +125,28 @@ struct pt_regs *old_regs = set_irq_regs(regs); struct irqdesc *desc = irq_desc + irq; +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + struct irq_controller *IRQ = (struct irq_controller *)IO_ADDRESS(DAVINCI_ARM_INTC_BASE); + unsigned int irq_number; + for(irq_number = 0 ; irq_number < 32 ; irq_number++) { + if((1 << irq_number) & (IRQ->IRQ0 & IRQ->EINT0)) { + avm_simple_profiling(regs, irq_number); + break; + } + } + if(irq_number == 32) { + for(irq_number = 0 ; irq_number < 32 ; irq_number++) { + if((1 << irq_number) & (IRQ->IRQ1 & IRQ->EINT1)) { + avm_simple_profiling(regs, irq_number + 32); + break; + } + } + } + avm_simple_profiling_log(avm_profile_data_type_hw_irq_begin, (unsigned int)desc, irq_number); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ +#if defined(CONFIG_CHECK_IDLE) + end_check_idle(); +#endif /*--- #if CONFIG_CHECK_IDLE ---*/ /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. @@ -129,9 +162,26 @@ irq_finish(irq); irq_exit(); +#if defined(CONFIG_AVM_SIMPLE_PROFILING) + avm_simple_profiling_log(avm_profile_data_type_hw_irq_end, (unsigned int)desc, irq_number); +#endif /*--- #if defined(CONFIG_AVM_SIMPLE_PROFILING) ---*/ set_irq_regs(old_regs); } +/*------------------------------------------------------------------------------------------*\ +\*------------------------------------------------------------------------------------------*/ +#ifdef CONFIG_SUPPORT_FIRQ +/* + * do_IRQ handles all hardware IRQ's. Decoded IRQs should not + * come via this function. Instead, they should provide their + * own 'handler' + */ +asmlinkage void asm_do_FIRQ(unsigned int irq, struct pt_regs *regs) +{ + asm_do_IRQ(irq, regs); +} +#endif /*--- #ifdef CONFIG_SUPPORT_FIRQ ---*/ + void set_irq_flags(unsigned int irq, unsigned int iflags) { struct irqdesc *desc;