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