162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci#include <linux/interrupt.h>
362306a36Sopenharmony_ci#include <linux/irq.h>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <asm/traps.h>
662306a36Sopenharmony_ci#include <asm/apollohw.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciunsigned int apollo_irq_startup(struct irq_data *data)
962306a36Sopenharmony_ci{
1062306a36Sopenharmony_ci	unsigned int irq = data->irq;
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci	if (irq < 8)
1362306a36Sopenharmony_ci		*(volatile unsigned char *)(pica+1) &= ~(1 << irq);
1462306a36Sopenharmony_ci	else
1562306a36Sopenharmony_ci		*(volatile unsigned char *)(picb+1) &= ~(1 << (irq - 8));
1662306a36Sopenharmony_ci	return 0;
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_civoid apollo_irq_shutdown(struct irq_data *data)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	unsigned int irq = data->irq;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	if (irq < 8)
2462306a36Sopenharmony_ci		*(volatile unsigned char *)(pica+1) |= (1 << irq);
2562306a36Sopenharmony_ci	else
2662306a36Sopenharmony_ci		*(volatile unsigned char *)(picb+1) |= (1 << (irq - 8));
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_civoid apollo_irq_eoi(struct irq_data *data)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	*(volatile unsigned char *)(pica) = 0x20;
3262306a36Sopenharmony_ci	*(volatile unsigned char *)(picb) = 0x20;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic struct irq_chip apollo_irq_chip = {
3662306a36Sopenharmony_ci	.name           = "apollo",
3762306a36Sopenharmony_ci	.irq_startup    = apollo_irq_startup,
3862306a36Sopenharmony_ci	.irq_shutdown   = apollo_irq_shutdown,
3962306a36Sopenharmony_ci	.irq_eoi	= apollo_irq_eoi,
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_civoid __init dn_init_IRQ(void)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	m68k_setup_user_interrupt(VEC_USER + 96, 16);
4662306a36Sopenharmony_ci	m68k_setup_irq_controller(&apollo_irq_chip, handle_fasteoi_irq,
4762306a36Sopenharmony_ci				  IRQ_APOLLO, 16);
4862306a36Sopenharmony_ci}
49