11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Platform dependent support for HP simulator.
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1998-2001 Hewlett-Packard Co
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/irq.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
136efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby#include "hpsim_ssc.h"
146efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int
1635d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixnerhpsim_irq_startup(struct irq_data *data)
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
2235d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixnerhpsim_irq_noop(struct irq_data *data)
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26d5dedd4507d307eb3f35f21b6e16f336fdc0d82aYinghai Lustatic int
2735d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixnerhpsim_set_affinity_noop(struct irq_data *d, const struct cpumask *b, bool f)
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
29d5dedd4507d307eb3f35f21b6e16f336fdc0d82aYinghai Lu	return 0;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32fb824f4838c3110c282268a3620f41da67b3f3fbThomas Gleixnerstatic struct irq_chip irq_type_hp_sim = {
3335d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.name =			"hpsim",
3435d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.irq_startup =		hpsim_irq_startup,
3535d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.irq_shutdown =		hpsim_irq_noop,
3635d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.irq_enable =		hpsim_irq_noop,
3735d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.irq_disable =		hpsim_irq_noop,
3835d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.irq_ack =		hpsim_irq_noop,
3935d75b0e03520ac09abd4a1f9490facf6a1ac82eThomas Gleixner	.irq_set_affinity =	hpsim_set_affinity_noop,
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
426efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slabystatic void hpsim_irq_set_chip(int irq)
436efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby{
446efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	struct irq_chip *chip = irq_get_chip(irq);
456efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
466efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	if (chip == &no_irq_chip)
476efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby		irq_set_chip(irq, &irq_type_hp_sim);
486efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby}
496efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
506efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slabystatic void hpsim_connect_irq(int intr, int irq)
516efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby{
526efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	ia64_ssc(intr, irq, 0, 0, SSC_CONNECT_INTERRUPT);
536efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby}
546efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
556efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slabyint hpsim_get_irq(int intr)
566efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby{
576efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	int irq = assign_irq_vector(AUTO_ASSIGN);
586efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
596efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	if (irq >= 0) {
606efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby		hpsim_irq_set_chip(irq);
616efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby		irq_set_handler(irq, handle_simple_irq);
626efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby		hpsim_connect_irq(intr, irq);
636efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	}
646efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
656efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	return irq;
666efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby}
676efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldshpsim_irq_init (void)
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
736efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby	for_each_active_irq(i)
746efb6b77ff6fd512e9ef45b29f1940cb924cd7a6Jiri Slaby		hpsim_irq_set_chip(i);
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
76