Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
[sfrench/cifs-2.6.git] / arch / ia64 / kernel / iosapic.c
index 9bf15fefa7e4e00517f2203cdde817b9299d9a14..d6aab40c64166ecdf6ae8c3529134e46ac4cd7a6 100644 (file)
@@ -288,6 +288,27 @@ nop (unsigned int irq)
        /* do nothing... */
 }
 
+
+#ifdef CONFIG_KEXEC
+void
+kexec_disable_iosapic(void)
+{
+       struct iosapic_intr_info *info;
+       struct iosapic_rte_info *rte;
+       u8 vec = 0;
+       for (info = iosapic_intr_info; info <
+                       iosapic_intr_info + IA64_NUM_VECTORS; ++info, ++vec) {
+               list_for_each_entry(rte, &info->rtes,
+                               rte_list) {
+                       iosapic_write(rte->addr,
+                                       IOSAPIC_RTE_LOW(rte->rte_index),
+                                       IOSAPIC_MASK|vec);
+                       iosapic_eoi(rte->addr, vec);
+               }
+       }
+}
+#endif
+
 static void
 mask_irq (unsigned int irq)
 {
@@ -426,7 +447,7 @@ iosapic_end_level_irq (unsigned int irq)
 #define iosapic_ack_level_irq          nop
 
 struct hw_interrupt_type irq_type_iosapic_level = {
-       .typename =     "IO-SAPIC-level",
+       .name =         "IO-SAPIC-level",
        .startup =      iosapic_startup_level_irq,
        .shutdown =     iosapic_shutdown_level_irq,
        .enable =       iosapic_enable_level_irq,
@@ -473,7 +494,7 @@ iosapic_ack_edge_irq (unsigned int irq)
 #define iosapic_end_edge_irq           nop
 
 struct hw_interrupt_type irq_type_iosapic_edge = {
-       .typename =     "IO-SAPIC-edge",
+       .name =         "IO-SAPIC-edge",
        .startup =      iosapic_startup_edge_irq,
        .shutdown =     iosapic_disable_edge_irq,
        .enable =       iosapic_enable_edge_irq,
@@ -664,7 +685,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
                        printk(KERN_WARNING
                               "%s: changing vector %d from %s to %s\n",
                               __FUNCTION__, vector,
-                              idesc->chip->typename, irq_type->typename);
+                              idesc->chip->name, irq_type->name);
                idesc->chip = irq_type;
        }
        return 0;
@@ -904,6 +925,11 @@ iosapic_unregister_intr (unsigned int gsi)
                        /* Clear the interrupt controller descriptor */
                        idesc->chip = &no_irq_type;
 
+#ifdef CONFIG_SMP
+                       /* Clear affinity */
+                       cpus_setall(idesc->affinity);
+#endif
+
                        /* Clear the interrupt information */
                        memset(&iosapic_intr_info[vector], 0,
                               sizeof(struct iosapic_intr_info));