===== arch/arm/mach-omap/irq.c 1.24 vs edited ===== --- 1.24/arch/arm/mach-omap/irq.c Thu May 6 18:34:45 2004 +++ edited/arch/arm/mach-omap/irq.c Thu May 6 18:30:45 2004 @@ -64,6 +64,39 @@ omap_writel(value, irq_banks[bank].base_reg + offset); } +static inline void bank_mask_irq(int bank, unsigned int irq) +{ + unsigned long mask; + int irq_bit; + + irq_bit = (irq - irq_banks[bank].start_irq); + mask = omap_readl(irq_banks[bank].mask_reg) | (1 << irq_bit); + omap_writel(mask, irq_banks[bank].mask_reg); +} + +static inline void bank_ack_irq(int bank, unsigned int irq) +{ + do { + omap_writel(0x1, irq_banks[bank].ack_reg); + } while (bank--); +} + +static inline void bank_unmask_irq(int bank, unsigned int irq) +{ + unsigned long mask; + int irq_bit; + + irq_bit = (irq - irq_banks[bank].start_irq); + mask = omap_readl(irq_banks[bank].mask_reg) & ~(1 << irq_bit); + omap_writel(mask, irq_banks[bank].mask_reg); +} + +static inline void bank_mask_ack_irq(int bank, unsigned int irq) +{ + bank_mask_irq(bank, irq); + bank_ack_irq(bank, irq); +} + /* * Ack routine for chips with register offsets of 0x100 */ ===== arch/arm/mach-omap/irq.h 1.7 vs edited ===== --- 1.7/arch/arm/mach-omap/irq.h Thu May 6 18:34:45 2004 +++ edited/arch/arm/mach-omap/irq.h Thu May 6 18:31:07 2004 @@ -72,6 +72,59 @@ .unmask = omap_offset_unmask_irq, }; +static inline void bank_mask_irq(int bank, unsigned int irq); +static inline void bank_ack_irq(int bank, unsigned int irq); +static inline void bank_unmask_irq(int bank, unsigned int irq); +static inline void bank_mask_ack_irq(int bank, unsigned int irq); + +/* + * Macros to generate interrupt handler functions for each bank + */ +#define BANKn_MASK_IRQ(n) static void bank ##n## _mask_irq(unsigned int irq) \ + { \ + bank_mask_irq(n, irq); \ + } + +#define BANKn_UNMASK_IRQ(n) static void bank ##n## _unmask_irq(unsigned int irq) \ + { \ + bank_unmask_irq(n, irq); \ + } + +#define BANKn_MASK_ACK_IRQ(n) static void bank ##n## _mask_ack_irq(unsigned int irq) \ + { \ + bank_mask_ack_irq(n, irq); \ + } + +#define OMAP_BANKn_IRQ(n) static struct irqchip omap_bank ##n## _irq = { \ + .ack = bank ##n## _mask_ack_irq, \ + .mask = bank ##n## _mask_irq, \ + .unmask = bank ##n## _unmask_irq, \ + }; + +/* Generate bank specific mask functions for each bank */ +BANKn_MASK_IRQ(0) +BANKn_MASK_IRQ(1) +BANKn_MASK_IRQ(2) +BANKn_MASK_IRQ(3) + +/* Generate bank specific unmask functions for each bank*/ +BANKn_UNMASK_IRQ(0) +BANKn_UNMASK_IRQ(1) +BANKn_UNMASK_IRQ(2) +BANKn_UNMASK_IRQ(3) + +/* Generate bank specific mask_ack_irqs for each bank */ +BANKn_MASK_ACK_IRQ(0) +BANKn_MASK_ACK_IRQ(1) +BANKn_MASK_ACK_IRQ(2) +BANKn_MASK_ACK_IRQ(3) + +/* Generate bank specific irq handlers for each bank */ +OMAP_BANKn_IRQ(0) +OMAP_BANKn_IRQ(1) +OMAP_BANKn_IRQ(2) +OMAP_BANKn_IRQ(3) + /* * OMAP-730 interrupt banks */