10aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel#include <linux/interrupt.h> 2bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven#include <linux/irq.h> 3bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/traps.h> 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/apollohw.h> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7e8abf5e73cdb6c034d35ccba1f63a4801cd3dec5Geert Uytterhoevenunsigned int apollo_irq_startup(struct irq_data *data) 80aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel{ 9e8abf5e73cdb6c034d35ccba1f63a4801cd3dec5Geert Uytterhoeven unsigned int irq = data->irq; 10e8abf5e73cdb6c034d35ccba1f63a4801cd3dec5Geert Uytterhoeven 110aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel if (irq < 8) 120aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel *(volatile unsigned char *)(pica+1) &= ~(1 << irq); 130aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel else 140aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel *(volatile unsigned char *)(picb+1) &= ~(1 << (irq - 8)); 150aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel return 0; 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18e8abf5e73cdb6c034d35ccba1f63a4801cd3dec5Geert Uytterhoevenvoid apollo_irq_shutdown(struct irq_data *data) 190aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel{ 20e8abf5e73cdb6c034d35ccba1f63a4801cd3dec5Geert Uytterhoeven unsigned int irq = data->irq; 21e8abf5e73cdb6c034d35ccba1f63a4801cd3dec5Geert Uytterhoeven 220aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel if (irq < 8) 230aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel *(volatile unsigned char *)(pica+1) |= (1 << irq); 240aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel else 250aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel *(volatile unsigned char *)(picb+1) |= (1 << (irq - 8)); 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 28bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoevenvoid apollo_irq_eoi(struct irq_data *data) 29bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven{ 30bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven *(volatile unsigned char *)(pica) = 0x20; 31bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven *(volatile unsigned char *)(picb) = 0x20; 32bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven} 33bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven 34c288bf2533e57174b90b07860c4391bcd1ea269cGeert Uytterhoevenstatic struct irq_chip apollo_irq_chip = { 350aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel .name = "apollo", 36c288bf2533e57174b90b07860c4391bcd1ea269cGeert Uytterhoeven .irq_startup = apollo_irq_startup, 37c288bf2533e57174b90b07860c4391bcd1ea269cGeert Uytterhoeven .irq_shutdown = apollo_irq_shutdown, 38bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven .irq_eoi = apollo_irq_eoi, 390aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel}; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4266a3f820cb6a88ef0481e042d4b48b2299deab7eAl Virovoid __init dn_init_IRQ(void) 430aa78106c661cf6c251fd56e92f0c76a7459d244Roman Zippel{ 44f30a6484f1bcb410d0af0c24f34b8e3d92682a05Geert Uytterhoeven m68k_setup_user_interrupt(VEC_USER + 96, 16); 45bc7485acd09405d9544783d773ee040af4a5c861Geert Uytterhoeven m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq, 46edb347256c44366888debb4f9e8477ac700a9026Geert Uytterhoeven IRQ_APOLLO, 16); 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 48