/*
 *  linux/include/asm-mips/tx3927/irq.h
 *
 * 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.
 *
 * Copyright (C) 2001 Toshiba Corporation
 */
#ifndef __ASM_TX3927_IRQ_H
#define __ASM_TX3927_IRQ_H

#ifndef __ASSEMBLY__

#include <asm/irq.h>

struct tb_irq_space {
	struct tb_irq_space* next;
	int start_irqno;
	int nr_irqs;
	void (*mask_func)(int irq_nr, int space_id);
	void (*unmask_func)(int irq_no, int space_id);
	const char *name;
	int space_id;
	int can_share;
};
extern struct tb_irq_space* tb_irq_spaces;

static __inline__ void add_tb_irq_space(struct tb_irq_space* sp)
{
	sp->next = tb_irq_spaces;
	tb_irq_spaces = sp;
}


struct pt_regs;
extern void
toshibaboards_spurious(struct pt_regs *regs, int irq);
extern void
toshibaboards_irqdispatch(struct pt_regs *regs, int irq);

extern struct irqaction *
toshibaboards_get_irq_action(int irq);
extern int
toshibaboards_setup_irq(int irq, struct irqaction * new);


extern int (*toshibaboards_gen_iack)(void);

#endif /* !__ASSEMBLY__ */

#define NR_ISA_IRQS 16
#define TB_IRQ_IS_ISA(irq)	\
	(0 <= (irq) && (irq) < NR_ISA_IRQS)
#define TB_IRQ_TO_ISA_IRQ(irq)	(irq)

#endif /* __ASM_TX3927_IRQ_H */
