1 // SPDX-License-Identifier: GPL-2.0 2 #include <linux/interrupt.h> 3 #include <linux/irq.h> 4 5 #include <asm/irq.h> 6 #include <asm/traps.h> 7 #include <asm/apollohw.h> 8 9 #include "apollo.h" 10 11 static unsigned int apollo_irq_startup(struct irq_data *data) 12 { 13 unsigned int irq = data->irq; 14 15 m68k_irq_startup(data); 16 17 if (irq < 8) 18 *(volatile unsigned char *)(pica+1) &= ~(1 << irq); 19 else 20 *(volatile unsigned char *)(picb+1) &= ~(1 << (irq - 8)); 21 22 return 0; 23 } 24 25 static void apollo_irq_shutdown(struct irq_data *data) 26 { 27 unsigned int irq = data->irq; 28 29 if (irq < 8) 30 *(volatile unsigned char *)(pica+1) |= (1 << irq); 31 else 32 *(volatile unsigned char *)(picb+1) |= (1 << (irq - 8)); 33 34 m68k_irq_shutdown(data); 35 } 36 37 static void apollo_irq_eoi(struct irq_data *data) 38 { 39 *(volatile unsigned char *)(pica) = 0x20; 40 *(volatile unsigned char *)(picb) = 0x20; 41 } 42 43 static struct irq_chip apollo_irq_chip = { 44 .name = "apollo", 45 .irq_startup = apollo_irq_startup, 46 .irq_shutdown = apollo_irq_shutdown, 47 .irq_eoi = apollo_irq_eoi, 48 }; 49 50 51 void __init dn_init_IRQ(void) 52 { 53 m68k_setup_user_interrupt(VEC_USER + 96, 16); 54 m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq, 55 IRQ_APOLLO, 16); 56 } 57