#
 obj-$(CONFIG_SMP) += smp.o
 
+obj-y += mpc85xx_common.o
+
 obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o
 obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o
 obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o
 
 #include <asm/cpm2.h>
 #include <sysdev/cpm2_pic.h>
 
+#include "mpc85xx.h"
 
 #define KSI8560_CPLD_HVR               0x04 /* Hardware Version Register */
 #define KSI8560_CPLD_PVR               0x08 /* PLD Version Register */
        for (;;);
 }
 
-static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_desc_get_chip(desc);
-       int cascade_irq;
-
-       while ((cascade_irq = cpm2_get_irq()) >= 0)
-               generic_handle_irq(cascade_irq);
-
-       chip->irq_eoi(&desc->irq_data);
-}
-
 static void __init ksi8560_pic_init(void)
 {
        struct mpic *mpic;
        struct resource r;
        struct device_node *np;
-#ifdef CONFIG_CPM2
-       int irq;
-#endif
 
        np = of_find_node_by_type(NULL, "open-pic");
 
 
        mpic_init(mpic);
 
-#ifdef CONFIG_CPM2
-       /* Setup CPM2 PIC */
-       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
-       if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
-               return;
-       }
-       irq = irq_of_parse_and_map(np, 0);
-
-       cpm2_pic_init(np);
-       of_node_put(np);
-       irq_set_chained_handler(irq, cpm2_cascade);
-#endif
+       mpc85xx_cpm2_pic_init();
 }
 
 #ifdef CONFIG_CPM2
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 void __init mpc8536_ds_pic_init(void)
 {
        struct mpic *mpic;
 
--- /dev/null
+#ifndef MPC85xx_H
+#define MPC85xx_H
+#ifdef CONFIG_CPM2
+extern void mpc85xx_cpm2_pic_init(void);
+#else
+static inline void __init mpc85xx_cpm2_pic_init(void) {}
+#endif /* CONFIG_CPM2 */
+
+#endif
 
 #include <sysdev/cpm2_pic.h>
 #endif
 
+#include "mpc85xx.h"
+
 #ifdef CONFIG_PCI
 static int mpc85xx_exclude_device(struct pci_controller *hose,
                                   u_char bus, u_char devfn)
 }
 #endif /* CONFIG_PCI */
 
-#ifdef CONFIG_CPM2
-
-static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_desc_get_chip(desc);
-       int cascade_irq;
-
-       while ((cascade_irq = cpm2_get_irq()) >= 0)
-               generic_handle_irq(cascade_irq);
-
-       chip->irq_eoi(&desc->irq_data);
-}
-
-#endif /* CONFIG_CPM2 */
-
 static void __init mpc85xx_ads_pic_init(void)
 {
        struct mpic *mpic;
        struct resource r;
        struct device_node *np = NULL;
-#ifdef CONFIG_CPM2
-       int irq;
-#endif
 
        np = of_find_node_by_type(np, "open-pic");
        if (!np) {
 
        mpic_init(mpic);
 
-#ifdef CONFIG_CPM2
-       /* Setup CPM2 PIC */
-       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
-       if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
-               return;
-       }
-       irq = irq_of_parse_and_map(np, 0);
-
-       cpm2_pic_init(np);
-       of_node_put(np);
-       irq_set_chained_handler(irq, cpm2_cascade);
-#endif
+       mpc85xx_cpm2_pic_init();
 }
 
 /*
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 /* CADMUS info */
 /* xxx - galak, move into device tree */
 #define CADMUS_BASE (0xf8004000)
 
--- /dev/null
+/*
+ * Routines common to most mpc85xx-based boards.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/of_platform.h>
+
+#include <sysdev/cpm2_pic.h>
+
+#include "mpc85xx.h"
+
+#ifdef CONFIG_CPM2
+static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
+{
+       struct irq_chip *chip = irq_desc_get_chip(desc);
+       int cascade_irq;
+
+       while ((cascade_irq = cpm2_get_irq()) >= 0)
+               generic_handle_irq(cascade_irq);
+
+       chip->irq_eoi(&desc->irq_data);
+}
+
+
+void __init mpc85xx_cpm2_pic_init(void)
+{
+       struct device_node *np;
+       int irq;
+
+       /* Setup CPM2 PIC */
+       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
+       if (np == NULL) {
+               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
+               return;
+       }
+       irq = irq_of_parse_and_map(np, 0);
+       if (irq == NO_IRQ) {
+               of_node_put(np);
+               printk(KERN_ERR "PIC init: got no IRQ for cpm cascade\n");
+               return;
+       }
+
+       cpm2_pic_init(np);
+       of_node_put(np);
+       irq_set_chained_handler(irq, cpm2_cascade);
+}
+#endif
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 #undef DEBUG
 
 #ifdef DEBUG
 
 #include <asm/mpic.h>
 #include <asm/swiotlb.h>
 
+#include "mpc85xx.h"
+
 #undef DEBUG
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 #undef DEBUG
 
 #ifdef DEBUG
 
 #include <sysdev/fsl_pci.h>
 #include <asm/fsl_guts.h>
 
+#include "mpc85xx.h"
+
 #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE)
 
 /*
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 #ifdef CONFIG_CPM2
 #include <asm/cpm2.h>
 #include <sysdev/cpm2_pic.h>
 #endif
 
-#ifdef CONFIG_CPM2
-
-static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_desc_get_chip(desc);
-       int cascade_irq;
-
-       while ((cascade_irq = cpm2_get_irq()) >= 0)
-               generic_handle_irq(cascade_irq);
-
-       chip->irq_eoi(&desc->irq_data);
-}
-
-#endif /* CONFIG_CPM2 */
-
 static void __init sbc8560_pic_init(void)
 {
        struct mpic *mpic;
        struct resource r;
        struct device_node *np = NULL;
-#ifdef CONFIG_CPM2
-       int irq;
-#endif
 
        np = of_find_node_by_type(np, "open-pic");
        if (!np) {
 
        mpic_init(mpic);
 
-#ifdef CONFIG_CPM2
-       /* Setup CPM2 PIC */
-       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
-       if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
-               return;
-       }
-       irq = irq_of_parse_and_map(np, 0);
-
-       cpm2_pic_init(np);
-       of_node_put(np);
-       irq_set_chained_handler(irq, cpm2_cascade);
-#endif
+       mpc85xx_cpm2_pic_init();
 }
 
 /*
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
 #include "socrates_fpga_pic.h"
 
 static void __init socrates_pic_init(void)
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 #ifdef CONFIG_CPM2
 #include <asm/cpm2.h>
-#include <sysdev/cpm2_pic.h>
-
-static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_desc_get_chip(desc);
-       int cascade_irq;
-
-       while ((cascade_irq = cpm2_get_irq()) >= 0)
-               generic_handle_irq(cascade_irq);
-
-       chip->irq_eoi(&desc->irq_data);
-}
 #endif /* CONFIG_CPM2 */
 
 static void __init stx_gp3_pic_init(void)
        struct mpic *mpic;
        struct resource r;
        struct device_node *np;
-#ifdef CONFIG_CPM2
-       int irq;
-#endif
 
        np = of_find_node_by_type(NULL, "open-pic");
        if (!np) {
 
        mpic_init(mpic);
 
-#ifdef CONFIG_CPM2
-       /* Setup CPM2 PIC */
-       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
-       if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
-               return;
-       }
-       irq = irq_of_parse_and_map(np, 0);
-
-       if (irq == NO_IRQ) {
-               of_node_put(np);
-               printk(KERN_ERR "PIC init: got no IRQ for cpm cascade\n");
-               return;
-       }
-
-       cpm2_pic_init(np);
-       of_node_put(np);
-       irq_set_chained_handler(irq, cpm2_cascade);
-#endif
+       mpc85xx_cpm2_pic_init();
 }
 
 /*
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 #ifdef CONFIG_CPM2
 #include <asm/cpm2.h>
-#include <sysdev/cpm2_pic.h>
-
-static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
-{
-       struct irq_chip *chip = irq_desc_get_chip(desc);
-       int cascade_irq;
-
-       while ((cascade_irq = cpm2_get_irq()) >= 0)
-               generic_handle_irq(cascade_irq);
-
-       chip->irq_eoi(&desc->irq_data);
-}
 #endif /* CONFIG_CPM2 */
 
 static void __init tqm85xx_pic_init(void)
        struct mpic *mpic;
        struct resource r;
        struct device_node *np;
-#ifdef CONFIG_CPM2
-       int irq;
-#endif
 
        np = of_find_node_by_type(NULL, "open-pic");
        if (!np) {
 
        mpic_init(mpic);
 
-#ifdef CONFIG_CPM2
-       /* Setup CPM2 PIC */
-       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
-       if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
-               return;
-       }
-       irq = irq_of_parse_and_map(np, 0);
-
-       if (irq == NO_IRQ) {
-               of_node_put(np);
-               printk(KERN_ERR "PIC init: got no IRQ for cpm cascade\n");
-               return;
-       }
-
-       cpm2_pic_init(np);
-       of_node_put(np);
-       irq_set_chained_handler(irq, cpm2_cascade);
-#endif
+       mpc85xx_cpm2_pic_init();
 }
 
 /*
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
 
+#include "mpc85xx.h"
+
 /* A few bit definitions needed for fixups on some boards */
 #define MPC85xx_L2CTL_L2E              0x80000000 /* L2 enable */
 #define MPC85xx_L2CTL_L2I              0x40000000 /* L2 flash invalidate */