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