[PATCH] powerpc: cleanup of iSeries flat device tree
[powerpc.git] / arch / powerpc / platforms / iseries / irq.c
index 42e978e..62bbbcf 100644 (file)
 #include <asm/iseries/it_lp_queue.h>
 
 #include "irq.h"
+#include "pci.h"
 #include "call_pci.h"
 
 #if defined(CONFIG_SMP)
 extern void iSeries_smp_message_recv(struct pt_regs *);
 #endif
 
+#ifdef CONFIG_PCI
+
 enum pci_event_type {
        pe_bus_created          = 0,    /* PHB has been created */
        pe_bus_error            = 1,    /* PHB has failed */
@@ -147,20 +150,11 @@ static void int_received(struct pci_event *event, struct pt_regs *regs)
 static void pci_event_handler(struct HvLpEvent *event, struct pt_regs *regs)
 {
        if (event && (event->xType == HvLpEvent_Type_PciIo)) {
-               switch (event->xFlags.xFunction) {
-               case HvLpEvent_Function_Int:
+               if (hvlpevent_is_int(event))
                        int_received((struct pci_event *)event, regs);
-                       break;
-               case HvLpEvent_Function_Ack:
+               else
                        printk(KERN_ERR
                                "pci_event_handler: unexpected ack received\n");
-                       break;
-               default:
-                       printk(KERN_ERR
-                               "pci_event_handler: unexpected event function %d\n",
-                               (int)event->xFlags.xFunction);
-                       break;
-               }
        } else if (event)
                printk(KERN_ERR
                        "pci_event_handler: Unrecognized PCI event type 0x%x\n",
@@ -319,12 +313,12 @@ static hw_irq_controller iSeries_IRQ_handler = {
  * Note that sub_bus is always 0 (at the moment at least).
  */
 int __init iSeries_allocate_IRQ(HvBusNumber bus,
-               HvSubBusNumber sub_bus, HvAgentId dev_id)
+               HvSubBusNumber sub_bus, u32 bsubbus)
 {
        int virtirq;
        unsigned int realirq;
-       u8 idsel = (dev_id >> 4);
-       u8 function = dev_id & 7;
+       u8 idsel = ISERIES_GET_DEVICE_FROM_SUBBUS(bsubbus);
+       u8 function = ISERIES_GET_FUNCTION_FROM_SUBBUS(bsubbus);
 
        realirq = (((((sub_bus << 8) + (bus - 1)) << 3) + (idsel - 1)) << 3)
                + function;
@@ -334,25 +328,26 @@ int __init iSeries_allocate_IRQ(HvBusNumber bus,
        return virtirq;
 }
 
+#endif /* CONFIG_PCI */
+
 /*
  * Get the next pending IRQ.
  */
 int iSeries_get_irq(struct pt_regs *regs)
 {
-       struct paca_struct *lpaca;
        /* -2 means ignore this interrupt */
        int irq = -2;
 
-       lpaca = get_paca();
 #ifdef CONFIG_SMP
-       if (lpaca->lppaca.int_dword.fields.ipi_cnt) {
-               lpaca->lppaca.int_dword.fields.ipi_cnt = 0;
+       if (get_lppaca()->int_dword.fields.ipi_cnt) {
+               get_lppaca()->int_dword.fields.ipi_cnt = 0;
                iSeries_smp_message_recv(regs);
        }
 #endif /* CONFIG_SMP */
        if (hvlpevent_is_pending())
                process_hvlpevents(regs);
 
+#ifdef CONFIG_PCI
        if (num_pending_irqs) {
                spin_lock(&pending_irqs_lock);
                for (irq = 0; irq < NR_IRQS; irq++) {
@@ -366,6 +361,7 @@ int iSeries_get_irq(struct pt_regs *regs)
                if (irq >= NR_IRQS)
                        irq = -2;
        }
+#endif
 
        return irq;
 }