2008-10-02 12:18:21 -05:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* SGI UV IRQ functions
*
* Copyright ( C ) 2008 Silicon Graphics , Inc . All rights reserved .
*/
# include <linux/module.h>
# include <linux/irq.h>
2008-10-03 11:38:37 +02:00
# include <asm/apic.h>
2008-10-02 12:18:21 -05:00
# include <asm/uv/uv_irq.h>
static void uv_noop ( unsigned int irq )
{
}
static unsigned int uv_noop_ret ( unsigned int irq )
{
return 0 ;
}
static void uv_ack_apic ( unsigned int irq )
{
ack_APIC_irq ( ) ;
}
struct irq_chip uv_irq_chip = {
. name = " UV-CORE " ,
. startup = uv_noop_ret ,
. shutdown = uv_noop ,
. enable = uv_noop ,
. disable = uv_noop ,
. ack = uv_noop ,
. mask = uv_noop ,
. unmask = uv_noop ,
. eoi = uv_ack_apic ,
. end = uv_noop ,
} ;
/*
* Set up a mapping of an available irq and vector , and enable the specified
* MMR that defines the MSI that is to be sent to the specified CPU when an
* interrupt is raised .
*/
int uv_setup_irq ( char * irq_name , int cpu , int mmr_blade ,
unsigned long mmr_offset )
{
int irq ;
int ret ;
irq = create_irq ( ) ;
if ( irq < = 0 )
return - EBUSY ;
ret = arch_enable_uv_irq ( irq_name , irq , cpu , mmr_blade , mmr_offset ) ;
if ( ret ! = irq )
destroy_irq ( irq ) ;
return ret ;
}
EXPORT_SYMBOL_GPL ( uv_setup_irq ) ;
/*
* Tear down a mapping of an irq and vector , and disable the specified MMR that
* defined the MSI that was to be sent to the specified CPU when an interrupt
* was raised .
*
* Set mmr_blade and mmr_offset to what was passed in on uv_setup_irq ( ) .
*/
void uv_teardown_irq ( unsigned int irq , int mmr_blade , unsigned long mmr_offset )
{
arch_disable_uv_irq ( mmr_blade , mmr_offset ) ;
destroy_irq ( irq ) ;
}
EXPORT_SYMBOL_GPL ( uv_teardown_irq ) ;