2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-16 15:20:36 -07:00
/*
* Copyright ( C ) 2003 Ralf Baechle
*
* Handler for RM7000 extended interrupts . These are a non - standard
* feature so we handle them separately from standard interrupts .
*/
# include <linux/init.h>
# include <linux/interrupt.h>
2010-10-07 14:08:54 +01:00
# include <linux/irq.h>
2005-04-16 15:20:36 -07:00
# include <linux/kernel.h>
# include <asm/irq_cpu.h>
# include <asm/mipsregs.h>
2011-03-23 21:09:00 +00:00
static inline void unmask_rm7k_irq ( struct irq_data * d )
2005-04-16 15:20:36 -07:00
{
2011-03-23 21:09:00 +00:00
set_c0_intcontrol ( 0x100 < < ( d - > irq - RM7K_CPU_IRQ_BASE ) ) ;
2005-04-16 15:20:36 -07:00
}
2011-03-23 21:09:00 +00:00
static inline void mask_rm7k_irq ( struct irq_data * d )
2005-04-16 15:20:36 -07:00
{
2011-03-23 21:09:00 +00:00
clear_c0_intcontrol ( 0x100 < < ( d - > irq - RM7K_CPU_IRQ_BASE ) ) ;
2005-04-16 15:20:36 -07:00
}
2006-07-02 14:41:42 +01:00
static struct irq_chip rm7k_irq_controller = {
2007-01-15 00:07:25 +09:00
. name = " RM7000 " ,
2011-03-23 21:09:00 +00:00
. irq_ack = mask_rm7k_irq ,
. irq_mask = mask_rm7k_irq ,
. irq_mask_ack = mask_rm7k_irq ,
. irq_unmask = unmask_rm7k_irq ,
. irq_eoi = unmask_rm7k_irq
2005-04-16 15:20:36 -07:00
} ;
2007-01-08 02:14:29 +09:00
void __init rm7k_cpu_irq_init ( void )
2005-04-16 15:20:36 -07:00
{
2007-01-08 02:14:29 +09:00
int base = RM7K_CPU_IRQ_BASE ;
2005-04-16 15:20:36 -07:00
int i ;
clear_c0_intcontrol ( 0x00000f00 ) ; /* Mask all */
2006-11-02 02:08:36 +09:00
for ( i = base ; i < base + 4 ; i + + )
2011-03-27 15:19:28 +02:00
irq_set_chip_and_handler ( i , & rm7k_irq_controller ,
2007-11-15 19:37:15 +00:00
handle_percpu_irq ) ;
2005-04-16 15:20:36 -07:00
}