2005-04-16 15:20:36 -07:00
/*
2006-09-18 23:26:25 +01:00
* arch / arm / mach - iop32x / irq . c
2005-04-16 15:20:36 -07:00
*
2006-09-18 23:10:26 +01:00
* Generic IOP32X IRQ handling functionality
2005-04-16 15:20:36 -07:00
*
* Author : Rory Bolt < rorybolt @ pacbell . net >
* Copyright ( C ) 2002 Rory Bolt
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
2006-09-18 23:26:25 +01:00
2005-04-16 15:20:36 -07:00
# include <linux/init.h>
# include <linux/interrupt.h>
# include <linux/list.h>
# include <asm/mach/irq.h>
# include <asm/irq.h>
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2005-04-16 15:20:36 -07:00
# include <asm/mach-types.h>
2006-09-18 23:26:25 +01:00
static u32 iop32x_mask ;
2005-04-16 15:20:36 -07:00
2007-05-15 01:03:36 +01:00
static void intctl_write ( u32 val )
2005-04-16 15:20:36 -07:00
{
2006-09-18 23:26:25 +01:00
asm volatile ( " mcr p6, 0, %0, c0, c0, 0 " : : " r " ( val ) ) ;
2005-04-16 15:20:36 -07:00
}
2007-05-15 01:03:36 +01:00
static void intstr_write ( u32 val )
2005-04-16 15:20:36 -07:00
{
2006-09-18 23:26:25 +01:00
asm volatile ( " mcr p6, 0, %0, c4, c0, 0 " : : " r " ( val ) ) ;
2005-04-16 15:20:36 -07:00
}
static void
2010-11-29 10:32:18 +01:00
iop32x_irq_mask ( struct irq_data * d )
2005-04-16 15:20:36 -07:00
{
2010-11-29 10:32:18 +01:00
iop32x_mask & = ~ ( 1 < < d - > irq ) ;
2006-09-18 23:26:25 +01:00
intctl_write ( iop32x_mask ) ;
2005-04-16 15:20:36 -07:00
}
static void
2010-11-29 10:32:18 +01:00
iop32x_irq_unmask ( struct irq_data * d )
2005-04-16 15:20:36 -07:00
{
2010-11-29 10:32:18 +01:00
iop32x_mask | = 1 < < d - > irq ;
2006-09-18 23:26:25 +01:00
intctl_write ( iop32x_mask ) ;
2005-04-16 15:20:36 -07:00
}
2006-08-01 22:26:25 +01:00
struct irq_chip ext_chip = {
2010-11-29 10:32:18 +01:00
. name = " IOP32x " ,
. irq_ack = iop32x_irq_mask ,
. irq_mask = iop32x_irq_mask ,
. irq_unmask = iop32x_irq_unmask ,
2005-04-16 15:20:36 -07:00
} ;
2006-09-18 23:26:25 +01:00
void __init iop32x_init_irq ( void )
2005-04-16 15:20:36 -07:00
{
2006-09-18 23:26:25 +01:00
int i ;
2005-04-16 15:20:36 -07:00
2007-02-13 17:12:04 +01:00
iop_init_cp6_handler ( ) ;
2006-09-18 23:26:25 +01:00
intctl_write ( 0 ) ;
intstr_write ( 0 ) ;
2006-09-21 02:46:03 +01:00
if ( machine_is_glantank ( ) | |
machine_is_iq80321 ( ) | |
2006-09-21 02:42:12 +01:00
machine_is_iq31244 ( ) | |
2007-07-15 20:12:23 +01:00
machine_is_n2100 ( ) | |
machine_is_em7210 ( ) )
2006-09-18 23:17:36 +01:00
* IOP3XX_PCIIRSR = 0x0f ;
2005-04-16 15:20:36 -07:00
2006-09-18 23:26:25 +01:00
for ( i = 0 ; i < NR_IRQS ; i + + ) {
2011-03-24 13:35:09 +01:00
irq_set_chip_and_handler ( i , & ext_chip , handle_level_irq ) ;
2005-04-16 15:20:36 -07:00
set_irq_flags ( i , IRQF_VALID | IRQF_PROBE ) ;
}
}