|
@@ -10,6 +10,8 @@
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/irq.h>
|
|
|
|
|
|
+#include "hpsim_ssc.h"
|
|
|
+
|
|
|
static unsigned int
|
|
|
hpsim_irq_startup(struct irq_data *data)
|
|
|
{
|
|
@@ -37,15 +39,37 @@ static struct irq_chip irq_type_hp_sim = {
|
|
|
.irq_set_affinity = hpsim_set_affinity_noop,
|
|
|
};
|
|
|
|
|
|
+static void hpsim_irq_set_chip(int irq)
|
|
|
+{
|
|
|
+ struct irq_chip *chip = irq_get_chip(irq);
|
|
|
+
|
|
|
+ if (chip == &no_irq_chip)
|
|
|
+ irq_set_chip(irq, &irq_type_hp_sim);
|
|
|
+}
|
|
|
+
|
|
|
+static void hpsim_connect_irq(int intr, int irq)
|
|
|
+{
|
|
|
+ ia64_ssc(intr, irq, 0, 0, SSC_CONNECT_INTERRUPT);
|
|
|
+}
|
|
|
+
|
|
|
+int hpsim_get_irq(int intr)
|
|
|
+{
|
|
|
+ int irq = assign_irq_vector(AUTO_ASSIGN);
|
|
|
+
|
|
|
+ if (irq >= 0) {
|
|
|
+ hpsim_irq_set_chip(irq);
|
|
|
+ irq_set_handler(irq, handle_simple_irq);
|
|
|
+ hpsim_connect_irq(intr, irq);
|
|
|
+ }
|
|
|
+
|
|
|
+ return irq;
|
|
|
+}
|
|
|
+
|
|
|
void __init
|
|
|
hpsim_irq_init (void)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- for_each_active_irq(i) {
|
|
|
- struct irq_chip *chip = irq_get_chip(i);
|
|
|
-
|
|
|
- if (chip == &no_irq_chip)
|
|
|
- irq_set_chip(i, &irq_type_hp_sim);
|
|
|
- }
|
|
|
+ for_each_active_irq(i)
|
|
|
+ hpsim_irq_set_chip(i);
|
|
|
}
|