Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3620fc1da28ad32d10d7c83eab33f48ec5b1da54
Commit:     3620fc1da28ad32d10d7c83eab33f48ec5b1da54
Parent:     eb12af43333dd9d54158f35147a79628c41152db
Author:     Randy Vinson <[EMAIL PROTECTED]>
AuthorDate: Wed Jun 6 16:26:15 2007 -0700
Committer:  Kumar Gala <[EMAIL PROTECTED]>
CommitDate: Mon Jul 23 22:34:40 2007 -0500

    [POWERPC] 85xxCDS: Allow 8259 cascade to share an MPIC interrupt line.
    
    The Freescale MPC8555CDS and MPC8548CDS reference hardware has a legacy
    8259 interrupt controller pair contained within a VIA VT82C686B Southbridge
    on the main carrier board. The processor complex plugs into the carrier
    card using a PCI slot which limits the available interrupts to the
    INTA-INTD PCI interrupts. The output of the 8259 cascade pair is routed
    through a gate array and connected to the PCI INTA interrupt line.
    The normal interrupt chaining hook (set_irq_chained_handler) does
    not allow sharing of the chained interrupt which prevents the
    use of PCI INTA by PCI devices. This patch allows the 8259 cascade
    pair to share their interrupt line with PCI devices.
    
    NOTE: The addition of the .end routine for the MPIC is not strictly
    necessary for this patch. It's there so this code will run from within
    the threaded interrupt context used by the Real Time patch.
    
    Signed-off-by: Randy Vinson <[EMAIL PROTECTED]>
    Signed-off-by: Kumar Gala <[EMAIL PROTECTED]>
---
 arch/powerpc/platforms/85xx/Kconfig       |    1 +
 arch/powerpc/platforms/85xx/mpc85xx_cds.c |   37 ++++++++++++++++++++++++----
 2 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/platforms/85xx/Kconfig 
b/arch/powerpc/platforms/85xx/Kconfig
index 99bb74d..f581840 100644
--- a/arch/powerpc/platforms/85xx/Kconfig
+++ b/arch/powerpc/platforms/85xx/Kconfig
@@ -18,6 +18,7 @@ config MPC8560_ADS
 config MPC85xx_CDS
        bool "Freescale MPC85xx CDS"
        select DEFAULT_UIMAGE
+       select PPC_I8259
        help
          This option enables support for the MPC85xx CDS board
 
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c 
b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
index 71200bd..81b7062 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
@@ -24,6 +24,7 @@
 #include <linux/seq_file.h>
 #include <linux/initrd.h>
 #include <linux/module.h>
+#include <linux/interrupt.h>
 #include <linux/fsl_devices.h>
 
 #include <asm/system.h>
@@ -119,16 +120,30 @@ DECLARE_PCI_FIXUP_EARLY(0x3fff, 0x1957, skip_fake_bridge);
 DECLARE_PCI_FIXUP_EARLY(0xff3f, 0x5719, skip_fake_bridge);
 
 #ifdef CONFIG_PPC_I8259
-#warning The i8259 PIC support is currently broken
-static void mpc85xx_8259_cascade(unsigned int irq, struct irq_desc *desc)
+static void mpc85xx_8259_cascade_handler(unsigned int irq,
+                                        struct irq_desc *desc)
 {
        unsigned int cascade_irq = i8259_irq();
 
        if (cascade_irq != NO_IRQ)
+               /* handle an interrupt from the 8259 */
                generic_handle_irq(cascade_irq);
 
-       desc->chip->eoi(irq);
+       /* check for any interrupts from the shared IRQ line */
+       handle_fasteoi_irq(irq, desc);
 }
+
+static irqreturn_t mpc85xx_8259_cascade_action(int irq, void *dev_id)
+{
+       return IRQ_HANDLED;
+}
+
+static struct irqaction mpc85xxcds_8259_irqaction = {
+       .handler = mpc85xx_8259_cascade_action,
+       .flags = IRQF_SHARED,
+       .mask = CPU_MASK_NONE,
+       .name = "8259 cascade",
+};
 #endif /* PPC_I8259 */
 #endif /* CONFIG_PCI */
 
@@ -137,7 +152,7 @@ static void __init mpc85xx_cds_pic_init(void)
        struct mpic *mpic;
        struct resource r;
        struct device_node *np = NULL;
-#ifdef CONFIG_PPC_I8259
+#if defined(CONFIG_PPC_I8259) && defined(CONFIG_PCI)
        struct device_node *cascade_node = NULL;
        int cascade_irq;
 #endif
@@ -165,7 +180,7 @@ static void __init mpc85xx_cds_pic_init(void)
 
        mpic_init(mpic);
 
-#ifdef CONFIG_PPC_I8259
+#if defined(CONFIG_PPC_I8259) && defined(CONFIG_PCI)
        /* Initialize the i8259 controller */
        for_each_node_by_type(np, "interrupt-controller")
                if (of_device_is_compatible(np, "chrp,iic")) {
@@ -187,7 +202,17 @@ static void __init mpc85xx_cds_pic_init(void)
        i8259_init(cascade_node, 0);
        of_node_put(cascade_node);
 
-       set_irq_chained_handler(cascade_irq, mpc85xx_8259_cascade);
+       /*
+        *  Hook the interrupt to make sure desc->action is never NULL.
+        *  This is required to ensure that the interrupt does not get
+        *  disabled when the last user of the shared IRQ line frees their
+        *  interrupt.
+        */
+       if (setup_irq(cascade_irq, &mpc85xxcds_8259_irqaction))
+               printk(KERN_ERR "Failed to setup cascade interrupt\n");
+       else
+               /* Success. Connect our low-level cascade handler. */
+               set_irq_handler(cascade_irq, mpc85xx_8259_cascade_handler);
 #endif /* CONFIG_PPC_I8259 */
 }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to