2008-03-27 14:51:40 -04:00
/*
* arch / arm / plat - orion / irq . c
*
* Marvell Orion SoC IRQ handling .
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/irq.h>
2012-06-27 13:40:04 +02:00
# include <linux/irqdomain.h>
2008-03-27 14:51:40 -04:00
# include <linux/io.h>
2012-06-27 13:40:04 +02:00
# include <linux/of_address.h>
# include <linux/of_irq.h>
2008-08-09 13:44:58 +02:00
# include <plat/irq.h>
2012-08-29 10:16:55 -05:00
# include <plat/orion-gpio.h>
2008-03-27 14:51:40 -04:00
void __init orion_irq_init ( unsigned int irq_start , void __iomem * maskaddr )
{
2011-04-14 19:17:57 +02:00
struct irq_chip_generic * gc ;
struct irq_chip_type * ct ;
2008-03-27 14:51:40 -04:00
/*
* Mask all interrupts initially .
*/
writel ( 0 , maskaddr ) ;
2011-04-14 19:17:57 +02:00
gc = irq_alloc_generic_chip ( " orion_irq " , 1 , irq_start , maskaddr ,
handle_level_irq ) ;
ct = gc - > chip_types ;
ct - > chip . irq_mask = irq_gc_mask_clr_bit ;
ct - > chip . irq_unmask = irq_gc_mask_set_bit ;
irq_setup_generic_chip ( gc , IRQ_MSK ( 32 ) , IRQ_GC_INIT_MASK_CACHE ,
IRQ_NOREQUEST , IRQ_LEVEL | IRQ_NOPROBE ) ;
2008-03-27 14:51:40 -04:00
}
2012-06-27 13:40:04 +02:00
# ifdef CONFIG_OF
static int __init orion_add_irq_domain ( struct device_node * np ,
struct device_node * interrupt_parent )
{
2012-11-17 17:00:44 +01:00
int i = 0 ;
2012-06-27 13:40:04 +02:00
void __iomem * base ;
do {
base = of_iomap ( np , i ) ;
if ( base ) {
orion_irq_init ( i * 32 , base ) ;
i + + ;
}
} while ( base ) ;
irq_domain_add_legacy ( np , i * 32 , 0 , 0 ,
& irq_domain_simple_ops , NULL ) ;
return 0 ;
}
static const struct of_device_id orion_irq_match [ ] = {
{ . compatible = " marvell,orion-intc " ,
. data = orion_add_irq_domain , } ,
{ } ,
} ;
void __init orion_dt_init_irq ( void )
{
of_irq_init ( orion_irq_match ) ;
}
# endif