|  | /* | 
|  | * arch/sh/boards/saturn/irq.c | 
|  | * | 
|  | * Copyright (C) 2002 Paul Mundt | 
|  | * | 
|  | * Released under the terms of the GNU GPL v2.0. | 
|  | */ | 
|  | #include <linux/kernel.h> | 
|  | #include <linux/init.h> | 
|  | #include <linux/interrupt.h> | 
|  | #include <asm/irq.h> | 
|  | #include <asm/io.h> | 
|  |  | 
|  | /* | 
|  | * Interrupts map out as follows: | 
|  | * | 
|  | *  Vector	Name		Mask | 
|  | * | 
|  | * 	64	VBLANKIN	0x0001 | 
|  | * 	65	VBLANKOUT	0x0002 | 
|  | *	66	HBLANKIN	0x0004 | 
|  | *	67	TIMER0		0x0008 | 
|  | *	68	TIMER1		0x0010 | 
|  | *	69	DSPEND		0x0020 | 
|  | *	70	SOUNDREQUEST	0x0040 | 
|  | *	71	SYSTEMMANAGER	0x0080 | 
|  | *	72	PAD		0x0100 | 
|  | *	73	LEVEL2DMAEND	0x0200 | 
|  | *	74	LEVEL1DMAEND	0x0400 | 
|  | *	75	LEVEL0DMAEND	0x0800 | 
|  | *	76	DMAILLEGAL	0x1000 | 
|  | *	77	SRITEDRAWEND	0x2000 | 
|  | *	78	ABUS		0x8000 | 
|  | * | 
|  | */ | 
|  | #define SATURN_IRQ_MIN		64	/* VBLANKIN */ | 
|  | #define SATURN_IRQ_MAX		78	/* ABUS */ | 
|  |  | 
|  | #define SATURN_IRQ_MASK		0xbfff | 
|  |  | 
|  | static inline u32 saturn_irq_mask(unsigned int irq_nr) | 
|  | { | 
|  | u32 mask; | 
|  |  | 
|  | mask = (1 << (irq_nr - SATURN_IRQ_MIN)); | 
|  | mask <<= (irq_nr == SATURN_IRQ_MAX); | 
|  | mask &= SATURN_IRQ_MASK; | 
|  |  | 
|  | return mask; | 
|  | } | 
|  |  | 
|  | static inline void mask_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | u32 mask; | 
|  |  | 
|  | mask = ctrl_inl(SATURN_IMR); | 
|  | mask |= saturn_irq_mask(irq_nr); | 
|  | ctrl_outl(mask, SATURN_IMR); | 
|  | } | 
|  |  | 
|  | static inline void unmask_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | u32 mask; | 
|  |  | 
|  | mask = ctrl_inl(SATURN_IMR); | 
|  | mask &= ~saturn_irq_mask(irq_nr); | 
|  | ctrl_outl(mask, SATURN_IMR); | 
|  | } | 
|  |  | 
|  | static void disable_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | mask_saturn_irq(irq_nr); | 
|  | } | 
|  |  | 
|  | static void enable_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | unmask_saturn_irq(irq_nr); | 
|  | } | 
|  |  | 
|  | static void mask_and_ack_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | mask_saturn_irq(irq_nr); | 
|  | } | 
|  |  | 
|  | static void end_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | if (!(irq_desc[irq_nr].status & (IRQ_DISABLED | IRQ_INPROGRESS))) | 
|  | unmask_saturn_irq(irq_nr); | 
|  | } | 
|  |  | 
|  | static unsigned int startup_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | unmask_saturn_irq(irq_nr); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static void shutdown_saturn_irq(unsigned int irq_nr) | 
|  | { | 
|  | mask_saturn_irq(irq_nr); | 
|  | } | 
|  |  | 
|  | static struct hw_interrupt_type saturn_int = { | 
|  | .typename	= "Saturn", | 
|  | .enable		= enable_saturn_irq, | 
|  | .disable	= disable_saturn_irq, | 
|  | .ack		= mask_and_ack_saturn_irq, | 
|  | .end		= end_saturn_irq, | 
|  | .startup	= startup_saturn_irq, | 
|  | .shutdown	= shutdown_saturn_irq, | 
|  | }; | 
|  |  | 
|  | int saturn_irq_demux(int irq_nr) | 
|  | { | 
|  | /* FIXME */ | 
|  | return irq_nr; | 
|  | } | 
|  |  |