mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
98 lines
3.6 KiB
C
98 lines
3.6 KiB
C
|
/*
|
||
|
* include/asm-v850/gbus_int.h -- Midas labs GBUS interrupt support
|
||
|
*
|
||
|
* Copyright (C) 2001,02 NEC Corporation
|
||
|
* Copyright (C) 2001,02 Miles Bader <miles@gnu.org>
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
* Written by Miles Bader <miles@gnu.org>
|
||
|
*/
|
||
|
|
||
|
#ifndef __V850_GBUS_INT_H__
|
||
|
#define __V850_GBUS_INT_H__
|
||
|
|
||
|
|
||
|
/* The GBUS interrupt interface has 32 interrupts shared among 4
|
||
|
processor interrupts. The 32 GBUS interrupts are divided into two
|
||
|
sets of 16 each, for allocating among control registers, etc (there
|
||
|
are two of each control register, with bits 0-15 controlling an
|
||
|
interrupt each). */
|
||
|
|
||
|
/* The GBUS interrupts themselves. */
|
||
|
#define IRQ_GBUS_INT(n) (GBUS_INT_BASE_IRQ + (n))
|
||
|
#define IRQ_GBUS_INT_NUM 32
|
||
|
|
||
|
/* Control registers. */
|
||
|
#define GBUS_INT_STATUS_ADDR(w) (GBUS_INT_BASE_ADDR + (w)*0x40)
|
||
|
#define GBUS_INT_STATUS(w) (*(volatile u16 *)GBUS_INT_STATUS_ADDR(w))
|
||
|
#define GBUS_INT_CLEAR_ADDR(w) (GBUS_INT_BASE_ADDR + 0x10 + (w)*0x40)
|
||
|
#define GBUS_INT_CLEAR(w) (*(volatile u16 *)GBUS_INT_CLEAR_ADDR(w))
|
||
|
#define GBUS_INT_EDGE_ADDR(w) (GBUS_INT_BASE_ADDR + 0x20 + (w)*0x40)
|
||
|
#define GBUS_INT_EDGE(w) (*(volatile u16 *)GBUS_INT_EDGE_ADDR(w))
|
||
|
#define GBUS_INT_POLARITY_ADDR(w) (GBUS_INT_BASE_ADDR + 0x30 + (w)*0x40)
|
||
|
#define GBUS_INT_POLARITY(w) (*(volatile u16 *)GBUS_INT_POLARITY_ADDR(w))
|
||
|
/* This allows enabling interrupt bits in word W for interrupt GINTn. */
|
||
|
#define GBUS_INT_ENABLE_ADDR(w, n) \
|
||
|
(GBUS_INT_BASE_ADDR + 0x100 + (w)*0x10 + (n)*0x20)
|
||
|
#define GBUS_INT_ENABLE(w, n) (*(volatile u16 *)GBUS_INT_ENABLE_ADDR(w, n))
|
||
|
|
||
|
/* Mapping between kernel interrupt numbers and hardware control regs/bits. */
|
||
|
#define GBUS_INT_BITS_PER_WORD 16
|
||
|
#define GBUS_INT_NUM_WORDS (IRQ_GBUS_INT_NUM / GBUS_INT_BITS_PER_WORD)
|
||
|
#define GBUS_INT_IRQ_WORD(irq) (((irq) - GBUS_INT_BASE_IRQ) >> 4)
|
||
|
#define GBUS_INT_IRQ_BIT(irq) (((irq) - GBUS_INT_BASE_IRQ) & 0xF)
|
||
|
#define GBUS_INT_IRQ_MASK(irq) (1 << GBUS_INT_IRQ_BIT(irq))
|
||
|
|
||
|
|
||
|
/* Possible priorities for GBUS interrupts. */
|
||
|
#define GBUS_INT_PRIORITY_HIGH 2
|
||
|
#define GBUS_INT_PRIORITY_MEDIUM 4
|
||
|
#define GBUS_INT_PRIORITY_LOW 6
|
||
|
|
||
|
|
||
|
#ifndef __ASSEMBLY__
|
||
|
|
||
|
/* Enable interrupt handling for interrupt IRQ. */
|
||
|
extern void gbus_int_enable_irq (unsigned irq);
|
||
|
/* Disable interrupt handling for interrupt IRQ. Note that any
|
||
|
interrupts received while disabled will be delivered once the
|
||
|
interrupt is enabled again, unless they are explicitly cleared using
|
||
|
`gbus_int_clear_pending_irq'. */
|
||
|
extern void gbus_int_disable_irq (unsigned irq);
|
||
|
/* Return true if interrupt handling for interrupt IRQ is enabled. */
|
||
|
extern int gbus_int_irq_enabled (unsigned irq);
|
||
|
/* Disable all GBUS irqs. */
|
||
|
extern void gbus_int_disable_irqs (void);
|
||
|
/* Clear any pending interrupts for IRQ. */
|
||
|
extern void gbus_int_clear_pending_irq (unsigned irq);
|
||
|
/* Return true if interrupt IRQ is pending (but disabled). */
|
||
|
extern int gbus_int_irq_pending (unsigned irq);
|
||
|
|
||
|
|
||
|
struct gbus_int_irq_init {
|
||
|
const char *name; /* name of interrupt type */
|
||
|
|
||
|
/* Range of kernel irq numbers for this type:
|
||
|
BASE, BASE+INTERVAL, ..., BASE+INTERVAL*NUM */
|
||
|
unsigned base, num, interval;
|
||
|
|
||
|
unsigned priority; /* interrupt priority to assign */
|
||
|
};
|
||
|
struct hw_interrupt_type; /* fwd decl */
|
||
|
|
||
|
/* Initialize HW_IRQ_TYPES for GBUS irqs described in array
|
||
|
INITS (which is terminated by an entry with the name field == 0). */
|
||
|
extern void gbus_int_init_irq_types (struct gbus_int_irq_init *inits,
|
||
|
struct hw_interrupt_type *hw_irq_types);
|
||
|
|
||
|
/* Initialize GBUS interrupts. */
|
||
|
extern void gbus_int_init_irqs (void);
|
||
|
|
||
|
#endif /* !__ASSEMBLY__ */
|
||
|
|
||
|
|
||
|
#endif /* __V850_GBUS_INT_H__ */
|