| #ifndef __ASM_SH_IRQ_H |
| #define __ASM_SH_IRQ_H |
| |
| /* |
| * |
| * linux/include/asm-sh/irq.h |
| * |
| * Copyright (C) 1999 Niibe Yutaka & Takeshi Yaegashi |
| * Copyright (C) 2000 Kazumoto Kojima |
| * |
| */ |
| |
| #include <linux/config.h> |
| #include <asm/machvec.h> |
| #include <asm/ptrace.h> /* for pt_regs */ |
| |
| #if defined(__sh3__) |
| #define INTC_IPRA 0xfffffee2UL |
| #define INTC_IPRB 0xfffffee4UL |
| #elif defined(__SH4__) |
| #define INTC_IPRA 0xffd00004UL |
| #define INTC_IPRB 0xffd00008UL |
| #define INTC_IPRC 0xffd0000cUL |
| #endif |
| |
| #define TIMER_IRQ 16 |
| #define TIMER_IPR_ADDR INTC_IPRA |
| #define TIMER_IPR_POS 3 |
| #define TIMER_PRIORITY 2 |
| |
| #define RTC_IRQ 22 |
| #define RTC_IPR_ADDR INTC_IPRA |
| #define RTC_IPR_POS 0 |
| #define RTC_PRIORITY TIMER_PRIORITY |
| |
| #if defined(__sh3__) |
| #define DMTE0_IRQ 48 |
| #define DMTE1_IRQ 49 |
| #define DMTE2_IRQ 50 |
| #define DMTE3_IRQ 51 |
| #define DMA_IPR_ADDR INTC_IPRE |
| #define DMA_IPR_POS 3 |
| #define DMA_PRIORITY 7 |
| #elif defined(__SH4__) |
| #define DMTE0_IRQ 34 |
| #define DMTE1_IRQ 35 |
| #define DMTE2_IRQ 36 |
| #define DMTE3_IRQ 37 |
| #define DMAE_IRQ 38 |
| #define DMA_IPR_ADDR INTC_IPRC |
| #define DMA_IPR_POS 2 |
| #define DMA_PRIORITY 7 |
| #endif |
| |
| #if defined (CONFIG_CPU_SUBTYPE_SH7707) || defined (CONFIG_CPU_SUBTYPE_SH7708) || \ |
| defined (CONFIG_CPU_SUBTYPE_SH7709) || defined (CONFIG_CPU_SUBTYPE_SH7750) || \ |
| defined (CONFIG_CPU_SUBTYPE_SH7751) |
| #define SCI_ERI_IRQ 23 |
| #define SCI_RXI_IRQ 24 |
| #define SCI_TXI_IRQ 25 |
| #define SCI_IPR_ADDR INTC_IPRB |
| #define SCI_IPR_POS 1 |
| #define SCI_PRIORITY 3 |
| #endif |
| |
| #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) |
| #define SCIF_ERI_IRQ 56 |
| #define SCIF_RXI_IRQ 57 |
| #define SCIF_BRI_IRQ 58 |
| #define SCIF_TXI_IRQ 59 |
| #define SCIF_IPR_ADDR INTC_IPRE |
| #define SCIF_IPR_POS 1 |
| #define SCIF_PRIORITY 3 |
| |
| #define IRDA_ERI_IRQ 52 |
| #define IRDA_RXI_IRQ 53 |
| #define IRDA_BRI_IRQ 54 |
| #define IRDA_TXI_IRQ 55 |
| #define IRDA_IPR_ADDR INTC_IPRE |
| #define IRDA_IPR_POS 2 |
| #define IRDA_PRIORITY 3 |
| #elif defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) || \ |
| defined(CONFIG_CPU_SUBTYPE_ST40STB1) |
| #define SCIF_ERI_IRQ 40 |
| #define SCIF_RXI_IRQ 41 |
| #define SCIF_BRI_IRQ 42 |
| #define SCIF_TXI_IRQ 43 |
| #define SCIF_IPR_ADDR INTC_IPRC |
| #define SCIF_IPR_POS 1 |
| #define SCIF_PRIORITY 3 |
| #if defined(CONFIG_CPU_SUBTYPE_ST40STB1) |
| #define SCIF1_ERI_IRQ 23 |
| #define SCIF1_RXI_IRQ 24 |
| #define SCIF1_BRI_IRQ 25 |
| #define SCIF1_TXI_IRQ 26 |
| #define SCIF1_IPR_ADDR INTC_IPRB |
| #define SCIF1_IPR_POS 1 |
| #define SCIF1_PRIORITY 3 |
| #endif |
| #endif |
| |
| /* NR_IRQS is made from three components: |
| * 1. ONCHIP_NR_IRQS - number of IRLS + on-chip peripherial modules |
| * 2. PINT_NR_IRQS - number of PINT interrupts |
| * 3. OFFCHIP_NR_IRQS - numbe of IRQs from off-chip peripherial modules |
| */ |
| |
| /* 1. ONCHIP_NR_IRQS */ |
| #ifdef CONFIG_SH_GENERIC |
| # define ONCHIP_NR_IRQS 144 |
| #else |
| # if defined(CONFIG_CPU_SUBTYPE_SH7707) |
| # define ONCHIP_NR_IRQS 64 |
| # define PINT_NR_IRQS 16 |
| # elif defined(CONFIG_CPU_SUBTYPE_SH7708) |
| # define ONCHIP_NR_IRQS 32 |
| # elif defined(CONFIG_CPU_SUBTYPE_SH7709) |
| # define ONCHIP_NR_IRQS 64 // Actually 61 |
| # define PINT_NR_IRQS 16 |
| # elif defined(CONFIG_CPU_SUBTYPE_SH7750) |
| # define ONCHIP_NR_IRQS 48 // Actually 44 |
| # elif defined(CONFIG_CPU_SUBTYPE_SH7751) |
| # define ONCHIP_NR_IRQS 72 |
| # elif defined(CONFIG_CPU_SUBTYPE_ST40STB1) |
| # define ONCHIP_NR_IRQS 144 |
| # endif |
| #endif |
| |
| /* 2. PINT_NR_IRQS */ |
| #ifdef CONFIG_SH_GENERIC |
| # define PINT_NR_IRQS 16 |
| #else |
| # ifndef PINT_NR_IRQS |
| # define PINT_NR_IRQS 0 |
| # endif |
| #endif |
| |
| #if PINT_NR_IRQS > 0 |
| # define PINT_IRQ_BASE ONCHIP_NR_IRQS |
| #endif |
| |
| /* 3. OFFCHIP_NR_IRQS */ |
| #ifdef CONFIG_SH_GENERIC |
| # define OFFCHIP_NR_IRQS 16 |
| #else |
| # if defined(CONFIG_HD64461) |
| # define OFFCHIP_NR_IRQS 16 |
| # elif defined (CONFIG_SH_BIGSUR) /* must be before CONFIG_HD64465 */ |
| # define OFFCHIP_NR_IRQS 48 |
| # elif defined(CONFIG_HD64465) |
| # define OFFCHIP_NR_IRQS 16 |
| # elif defined (CONFIG_SH_EC3104) |
| # define OFFCHIP_NR_IRQS 16 |
| # elif defined (CONFIG_SH_DREAMCAST) |
| # define OFFCHIP_NR_IRQS 96 |
| # else |
| # define OFFCHIP_NR_IRQS 0 |
| # endif |
| #endif |
| |
| #if OFFCHIP_NR_IRQS > 0 |
| # define OFFCHIP_IRQ_BASE (ONCHIP_NR_IRQS + PINT_NR_IRQS) |
| #endif |
| |
| /* NR_IRQS. 1+2+3 */ |
| #define NR_IRQS (ONCHIP_NR_IRQS + PINT_NR_IRQS + OFFCHIP_NR_IRQS) |
| |
| /* In a generic kernel, NR_IRQS is an upper bound, and we should use |
| * ACTUAL_NR_IRQS (which uses the machine vector) to get the correct value. |
| */ |
| #ifdef CONFIG_SH_GENERIC |
| # define ACTUAL_NR_IRQS (sh_mv.mv_nr_irqs) |
| #else |
| # define ACTUAL_NR_IRQS NR_IRQS |
| #endif |
| |
| |
| extern void disable_irq(unsigned int); |
| extern void disable_irq_nosync(unsigned int); |
| extern void enable_irq(unsigned int); |
| |
| /* |
| * Simple Mask Register Support |
| */ |
| extern void make_maskreg_irq(unsigned int irq); |
| extern unsigned short *irq_mask_register; |
| |
| /* |
| * Function for "on chip support modules". |
| */ |
| extern void make_ipr_irq(unsigned int irq, unsigned int addr, |
| int pos, int priority); |
| extern void make_imask_irq(unsigned int irq); |
| |
| #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) |
| #define INTC_IRR0 0xa4000004UL |
| #define INTC_IRR1 0xa4000006UL |
| #define INTC_IRR2 0xa4000008UL |
| |
| #define INTC_ICR0 0xfffffee0UL |
| #define INTC_ICR1 0xa4000010UL |
| #define INTC_ICR2 0xa4000012UL |
| #define INTC_INTER 0xa4000014UL |
| |
| #define INTC_IPRC 0xa4000016UL |
| #define INTC_IPRD 0xa4000018UL |
| #define INTC_IPRE 0xa400001aUL |
| #if defined(CONFIG_CPU_SUBTYPE_SH7707) |
| #define INTC_IPRF 0xa400001cUL |
| #endif |
| |
| #define PORT_PACR 0xa4000100UL |
| #define PORT_PBCR 0xa4000102UL |
| #define PORT_PCCR 0xa4000104UL |
| #define PORT_PFCR 0xa400010aUL |
| #define PORT_PADR 0xa4000120UL |
| #define PORT_PBDR 0xa4000122UL |
| #define PORT_PCDR 0xa4000124UL |
| #define PORT_PFDR 0xa400012aUL |
| |
| #define IRQ0_IRQ 32 |
| #define IRQ1_IRQ 33 |
| #define IRQ2_IRQ 34 |
| #define IRQ3_IRQ 35 |
| #define IRQ4_IRQ 36 |
| #define IRQ5_IRQ 37 |
| |
| #define IRQ0_IPR_ADDR INTC_IPRC |
| #define IRQ1_IPR_ADDR INTC_IPRC |
| #define IRQ2_IPR_ADDR INTC_IPRC |
| #define IRQ3_IPR_ADDR INTC_IPRC |
| #define IRQ4_IPR_ADDR INTC_IPRD |
| #define IRQ5_IPR_ADDR INTC_IPRD |
| |
| #define IRQ0_IPR_POS 0 |
| #define IRQ1_IPR_POS 1 |
| #define IRQ2_IPR_POS 2 |
| #define IRQ3_IPR_POS 3 |
| #define IRQ4_IPR_POS 0 |
| #define IRQ5_IPR_POS 1 |
| |
| #define IRQ0_PRIORITY 1 |
| #define IRQ1_PRIORITY 1 |
| #define IRQ2_PRIORITY 1 |
| #define IRQ3_PRIORITY 1 |
| #define IRQ4_PRIORITY 1 |
| #define IRQ5_PRIORITY 1 |
| |
| #define PINT0_IRQ 40 |
| #define PINT8_IRQ 41 |
| |
| #define PINT0_IPR_ADDR INTC_IPRD |
| #define PINT8_IPR_ADDR INTC_IPRD |
| |
| #define PINT0_IPR_POS 3 |
| #define PINT8_IPR_POS 2 |
| #define PINT0_PRIORITY 2 |
| #define PINT8_PRIORITY 2 |
| |
| extern int ipr_irq_demux(int irq); |
| #define __irq_demux(irq) ipr_irq_demux(irq) |
| |
| #else |
| #define __irq_demux(irq) irq |
| #endif /* CONFIG_CPU_SUBTYPE_SH7707 || CONFIG_CPU_SUBTYPE_SH7709 */ |
| |
| #if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) || \ |
| defined(CONFIG_CPU_SUBTYPE_ST40STB1) |
| #define INTC_ICR 0xffd00000 |
| #define INTC_ICR_NMIL (1<<15) |
| #define INTC_ICR_MAI (1<<14) |
| #define INTC_ICR_NMIB (1<<9) |
| #define INTC_ICR_NMIE (1<<8) |
| #define INTC_ICR_IRLM (1<<7) |
| #endif |
| |
| #ifdef CONFIG_CPU_SUBTYPE_ST40STB1 |
| #define INTC2_FIRST_IRQ 64 |
| #define NR_INTC2_IRQS 25 |
| |
| #define INTC2_BASE0 0xfe080000 |
| #define INTC2_INTC2MODE (INTC2_BASE0+0x80) |
| |
| #define INTC2_INTPRI_OFFSET 0x00 |
| #define INTC2_INTREQ_OFFSET 0x20 |
| #define INTC2_INTMSK_OFFSET 0x40 |
| #define INTC2_INTMSKCLR_OFFSET 0x60 |
| |
| extern void make_intc2_irq(unsigned int irq,unsigned int addr, |
| unsigned int group,int pos,int priority); |
| |
| #endif |
| |
| #ifdef CONFIG_SH_GENERIC |
| |
| static __inline__ int irq_demux(int irq) |
| { |
| if (sh_mv.mv_irq_demux) { |
| irq = sh_mv.mv_irq_demux(irq); |
| } |
| return __irq_demux(irq); |
| } |
| |
| #elif defined(CONFIG_SH_BIGSUR) |
| |
| extern int bigsur_irq_demux(int irq); |
| #define irq_demux(irq) bigsur_irq_demux(irq) |
| |
| #elif defined(CONFIG_HD64461) |
| |
| extern int hd64461_irq_demux(int irq); |
| #define irq_demux(irq) hd64461_irq_demux(irq) |
| |
| #elif defined(CONFIG_HD64465) |
| |
| extern int hd64465_irq_demux(int irq); |
| #define irq_demux(irq) hd64465_irq_demux(irq) |
| |
| #elif defined(CONFIG_SH_EC3104) |
| |
| extern int ec3104_irq_demux(int irq); |
| #define irq_demux ec3104_irq_demux |
| |
| #elif defined(CONFIG_SH_CAT68701) |
| |
| extern int cat68701_irq_demux(int irq); |
| #define irq_demux cat68701_irq_demux |
| |
| #elif defined(CONFIG_SH_DREAMCAST) |
| |
| extern int systemasic_irq_demux(int irq); |
| #define irq_demux systemasic_irq_demux |
| |
| #else |
| |
| #define irq_demux(irq) __irq_demux(irq) |
| |
| #endif |
| |
| |
| |
| #endif /* __ASM_SH_IRQ_H */ |