162306a36Sopenharmony_ci /*
262306a36Sopenharmony_ci * linux/arch/m68k/sun3/sun3ints.c -- Sun-3(x) Linux interrupt handling code
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
562306a36Sopenharmony_ci * License.  See the file COPYING in the main directory of this archive
662306a36Sopenharmony_ci * for more details.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci#include <linux/kernel.h>
1162306a36Sopenharmony_ci#include <linux/sched.h>
1262306a36Sopenharmony_ci#include <linux/kernel_stat.h>
1362306a36Sopenharmony_ci#include <linux/interrupt.h>
1462306a36Sopenharmony_ci#include <asm/intersil.h>
1562306a36Sopenharmony_ci#include <asm/oplib.h>
1662306a36Sopenharmony_ci#include <asm/sun3ints.h>
1762306a36Sopenharmony_ci#include <asm/irq_regs.h>
1862306a36Sopenharmony_ci#include <linux/seq_file.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciextern void sun3_leds (unsigned char);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_civoid sun3_disable_interrupts(void)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	sun3_disable_irq(0);
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_civoid sun3_enable_interrupts(void)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	sun3_enable_irq(0);
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic int led_pattern[8] = {
3362306a36Sopenharmony_ci       ~(0x80), ~(0x01),
3462306a36Sopenharmony_ci       ~(0x40), ~(0x02),
3562306a36Sopenharmony_ci       ~(0x20), ~(0x04),
3662306a36Sopenharmony_ci       ~(0x10), ~(0x08)
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_civolatile unsigned char* sun3_intreg;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_civoid sun3_enable_irq(unsigned int irq)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	*sun3_intreg |=  (1 << irq);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_civoid sun3_disable_irq(unsigned int irq)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	*sun3_intreg &= ~(1 << irq);
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic irqreturn_t sun3_int7(int irq, void *dev_id)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	unsigned int cnt;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	cnt = kstat_irqs_cpu(irq, 0);
5662306a36Sopenharmony_ci	if (!(cnt % 2000))
5762306a36Sopenharmony_ci		sun3_leds(led_pattern[cnt % 16000 / 2000]);
5862306a36Sopenharmony_ci	return IRQ_HANDLED;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic irqreturn_t sun3_int5(int irq, void *dev_id)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	unsigned long flags;
6462306a36Sopenharmony_ci	unsigned int cnt;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	local_irq_save(flags);
6762306a36Sopenharmony_ci#ifdef CONFIG_SUN3
6862306a36Sopenharmony_ci	intersil_clear();
6962306a36Sopenharmony_ci#endif
7062306a36Sopenharmony_ci	sun3_disable_irq(5);
7162306a36Sopenharmony_ci	sun3_enable_irq(5);
7262306a36Sopenharmony_ci#ifdef CONFIG_SUN3
7362306a36Sopenharmony_ci	intersil_clear();
7462306a36Sopenharmony_ci#endif
7562306a36Sopenharmony_ci	legacy_timer_tick(1);
7662306a36Sopenharmony_ci	cnt = kstat_irqs_cpu(irq, 0);
7762306a36Sopenharmony_ci	if (!(cnt % 20))
7862306a36Sopenharmony_ci		sun3_leds(led_pattern[cnt % 160 / 20]);
7962306a36Sopenharmony_ci	local_irq_restore(flags);
8062306a36Sopenharmony_ci	return IRQ_HANDLED;
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic irqreturn_t sun3_vec255(int irq, void *dev_id)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	return IRQ_HANDLED;
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_civoid __init sun3_init_IRQ(void)
8962306a36Sopenharmony_ci{
9062306a36Sopenharmony_ci	*sun3_intreg = 1;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	m68k_setup_user_interrupt(VEC_USER, 128);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	if (request_irq(IRQ_AUTO_5, sun3_int5, 0, "clock", NULL))
9562306a36Sopenharmony_ci		pr_err("Couldn't register %s interrupt\n", "int5");
9662306a36Sopenharmony_ci	if (request_irq(IRQ_AUTO_7, sun3_int7, 0, "nmi", NULL))
9762306a36Sopenharmony_ci		pr_err("Couldn't register %s interrupt\n", "int7");
9862306a36Sopenharmony_ci	if (request_irq(IRQ_USER+127, sun3_vec255, 0, "vec255", NULL))
9962306a36Sopenharmony_ci		pr_err("Couldn't register %s interrupt\n", "vec255");
10062306a36Sopenharmony_ci}
101