Merge branch 'merge'
authorPaul Mackerras <paulus@samba.org>
Fri, 25 Aug 2006 04:56:07 +0000 (14:56 +1000)
committerPaul Mackerras <paulus@samba.org>
Fri, 25 Aug 2006 04:56:07 +0000 (14:56 +1000)
15 files changed:
1  2 
arch/powerpc/Kconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/cpu_setup_ppc970.S
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/machine_kexec_64.c
arch/powerpc/kernel/prom_parse.c
arch/powerpc/kernel/time.c
arch/powerpc/platforms/85xx/mpc85xx_ads.c
arch/powerpc/platforms/85xx/mpc85xx_cds.c
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/tsi108_pci.c
include/asm-powerpc/system.h

diff --combined arch/powerpc/Kconfig
@@@ -426,8 -426,7 +426,8 @@@ config PPC_IBM_CELL_BLAD
        select UDBG_RTAS_CONSOLE
  
  config UDBG_RTAS_CONSOLE
 -      bool
 +      bool "RTAS based debug console"
 +      depends on PPC_RTAS
        default n
  
  config XICS
@@@ -837,9 -836,10 +837,10 @@@ config MC
        bool
  
  config PCI
-       bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) \
-                                 || MPC7448HPC2
-       default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx && !PPC_86xx
+       bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
+               || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES) || MPC7448HPC2
+       default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx \
+               && !PPC_85xx && !PPC_86xx
        default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
        default PCI_QSPAN if !4xx && !CPM2 && 8xx
        help
@@@ -16,7 -16,7 +16,7 @@@ obj-y                         := semaphore.o cputable.o ptra
  obj-y                         += vdso32/
  obj-$(CONFIG_PPC64)           += setup_64.o binfmt_elf32.o sys_ppc32.o \
                                   signal_64.o ptrace32.o \
 -                                 paca.o cpu_setup_power4.o \
 +                                 paca.o cpu_setup_ppc970.o \
                                   firmware.o sysfs.o
  obj-$(CONFIG_PPC64)           += vdso64/
  obj-$(CONFIG_ALTIVEC)         += vecemu.o vector.o
@@@ -67,9 -67,9 +67,9 @@@ pci64-$(CONFIG_PPC64)         += pci_64.o pci_
                                   pci_direct_iommu.o iomap.o
  pci32-$(CONFIG_PPC32)         := pci_32.o
  obj-$(CONFIG_PCI)             += $(pci64-y) $(pci32-y)
- kexec-$(CONFIG_PPC64)         := machine_kexec_64.o crash.o
+ kexec-$(CONFIG_PPC64)         := machine_kexec_64.o
  kexec-$(CONFIG_PPC32)         := machine_kexec_32.o
- obj-$(CONFIG_KEXEC)           += machine_kexec.o $(kexec-y)
+ obj-$(CONFIG_KEXEC)           += machine_kexec.o crash.o $(kexec-y)
  
  ifeq ($(CONFIG_PPC_ISERIES),y)
  $(obj)/head_64.o: $(obj)/lparmap.s
  #include <asm/asm-offsets.h>
  #include <asm/cache.h>
  
 -_GLOBAL(__970_cpu_preinit)
 -      /*
 -       * Do nothing if not running in HV mode
 -       */
 +_GLOBAL(__cpu_preinit_ppc970)
 +      /* Do nothing if not running in HV mode */
        mfmsr   r0
        rldicl. r0,r0,4,63
        beqlr
  
 -      /*
 -       * Deal only with PPC970 and PPC970FX.
 -       */
 -      mfspr   r0,SPRN_PVR
 -      srwi    r0,r0,16
 -      cmpwi   r0,0x39
 -      beq     1f
 -      cmpwi   r0,0x3c
 -      beq     1f
 -      cmpwi   r0,0x44
 -      bnelr
 -1:
 -
        /* Make sure HID4:rm_ci is off before MMU is turned off, that large
         * pages are enabled with HID4:61 and clear HID5:DCBZ_size and
         * HID5:DCBZ32_ill
        isync
        blr
  
 -_GLOBAL(__setup_cpu_ppc970)
 -      mfspr   r0,SPRN_HID0
 -      li      r11,5                   /* clear DOZE and SLEEP */
 -      rldimi  r0,r11,52,8             /* set NAP and DPM */
 -      li      r11,0
 -      rldimi  r0,r11,32,31            /* clear EN_ATTN */
 -      mtspr   SPRN_HID0,r0
 -      mfspr   r0,SPRN_HID0
 -      mfspr   r0,SPRN_HID0
 -      mfspr   r0,SPRN_HID0
 -      mfspr   r0,SPRN_HID0
 -      mfspr   r0,SPRN_HID0
 -      mfspr   r0,SPRN_HID0
 -      sync
 -      isync
 -      blr
 -
  /* Definitions for the table use to save CPU states */
  #define CS_HID0               0
  #define CS_HID1               8
@@@ -71,28 -103,33 +71,30 @@@ cpu_state_storage
        .balign L1_CACHE_BYTES,0
        .text
  
 -/* Called in normal context to backup CPU 0 state. This
 - * does not include cache settings. This function is also
 - * called for machine sleep. This does not include the MMU
 - * setup, BATs, etc... but rather the "special" registers
 - * like HID0, HID1, HID4, etc...
 - */
 -_GLOBAL(__save_cpu_setup)
 -      /* Some CR fields are volatile, we back it up all */
 -      mfcr    r7
 -
 -      /* Get storage ptr */
 -      LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
  
 -      /* We only deal with 970 for now */
 -      mfspr   r0,SPRN_PVR
 -      srwi    r0,r0,16
 -      cmpwi   r0,0x39
 -      beq     1f
 -      cmpwi   r0,0x3c
 -      beq     1f
 -      cmpwi   r0,0x44
 -      bne     2f
 -
 -1:    /* skip if not running in HV mode */
 +_GLOBAL(__setup_cpu_ppc970)
 +      /* Do nothing if not running in HV mode */
        mfmsr   r0
        rldicl. r0,r0,4,63
 -      beq     2f
 +      beqlr
 +
 +      mfspr   r0,SPRN_HID0
 +      li      r11,5                   /* clear DOZE and SLEEP */
 +      rldimi  r0,r11,52,8             /* set NAP and DPM */
++      li      r11,0
++      rldimi  r0,r11,32,31            /* clear EN_ATTN */
 +      mtspr   SPRN_HID0,r0
 +      mfspr   r0,SPRN_HID0
 +      mfspr   r0,SPRN_HID0
 +      mfspr   r0,SPRN_HID0
 +      mfspr   r0,SPRN_HID0
 +      mfspr   r0,SPRN_HID0
 +      mfspr   r0,SPRN_HID0
 +      sync
 +      isync
 +
 +      /* Save away cpu state */
 +      LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
  
        /* Save HID0,1,4 and 5 */
        mfspr   r3,SPRN_HID0
        mfspr   r3,SPRN_HID5
        std     r3,CS_HID5(r5)
  
 -2:
 -      mtcr    r7
        blr
  
  /* Called with no MMU context (typically MSR:IR/DR off) to
   * restore CPU state as backed up by the previous
   * function. This does not include cache setting
   */
 -_GLOBAL(__restore_cpu_setup)
 -      /* Get storage ptr (FIXME when using anton reloc as we
 -       * are running with translation disabled here
 -       */
 -      LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
 -
 -      /* We only deal with 970 for now */
 -      mfspr   r0,SPRN_PVR
 -      srwi    r0,r0,16
 -      cmpwi   r0,0x39
 -      beq     1f
 -      cmpwi   r0,0x3c
 -      beq     1f
 -      cmpwi   r0,0x44
 -      bnelr
 -
 -1:    /* skip if not running in HV mode */
 +_GLOBAL(__restore_cpu_ppc970)
 +      /* Do nothing if not running in HV mode */
        mfmsr   r0
        rldicl. r0,r0,4,63
        beqlr
  
 +      LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
        /* Before accessing memory, we make sure rm_ci is clear */
        li      r0,0
        mfspr   r3,SPRN_HID4
@@@ -52,7 -52,6 +52,7 @@@
  #include <linux/radix-tree.h>
  #include <linux/mutex.h>
  #include <linux/bootmem.h>
 +#include <linux/pci.h>
  
  #include <asm/uaccess.h>
  #include <asm/system.h>
@@@ -694,7 -693,7 +694,7 @@@ unsigned int irq_radix_revmap(struct ir
        /* If not there, try to insert it */
        virq = irq_find_mapping(host, hwirq);
        if (virq != NO_IRQ)
-               radix_tree_insert(tree, virq, &irq_map[virq]);
+               radix_tree_insert(tree, hwirq, &irq_map[virq]);
   bail:
        spin_unlock_irqrestore(&irq_big_lock, flags);
        return virq;
@@@ -828,14 -827,12 +828,14 @@@ int pci_enable_msi(struct pci_dev * pde
        else
                return -1;
  }
 +EXPORT_SYMBOL(pci_enable_msi);
  
  void pci_disable_msi(struct pci_dev * pdev)
  {
        if (ppc_md.disable_msi)
                ppc_md.disable_msi(pdev);
  }
 +EXPORT_SYMBOL(pci_disable_msi);
  
  void pci_scan_msi_device(struct pci_dev *dev) {}
  int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) {return -1;}
@@@ -843,8 -840,6 +843,8 @@@ void pci_disable_msix(struct pci_dev *d
  void msi_remove_pci_irq_vectors(struct pci_dev *dev) {}
  void disable_msi_mode(struct pci_dev *dev, int pos, int type) {}
  void pci_no_msi(void) {}
 +EXPORT_SYMBOL(pci_enable_msix);
 +EXPORT_SYMBOL(pci_disable_msix);
  
  #endif
  
@@@ -39,17 -39,16 +39,17 @@@ static int __init add_legacy_port(struc
                                  phys_addr_t taddr, unsigned long irq,
                                  upf_t flags, int irq_check_parent)
  {
 -      u32 *clk, *spd, clock = BASE_BAUD * 16;
 +      const u32 *clk, *spd;
 +      u32 clock = BASE_BAUD * 16;
        int index;
  
        /* get clock freq. if present */
 -      clk = (u32 *)get_property(np, "clock-frequency", NULL);
 +      clk = get_property(np, "clock-frequency", NULL);
        if (clk && *clk)
                clock = *clk;
  
        /* get default speed if present */
 -      spd = (u32 *)get_property(np, "current-speed", NULL);
 +      spd = get_property(np, "current-speed", NULL);
  
        /* If we have a location index, then try to use it */
        if (want_index >= 0 && want_index < MAX_LEGACY_SERIAL_PORTS)
@@@ -114,8 -113,9 +114,9 @@@ static int __init add_legacy_soc_port(s
                                      struct device_node *soc_dev)
  {
        u64 addr;
 -      u32 *addrp;
 +      const u32 *addrp;
        upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
+       struct device_node *tsi = of_get_parent(np);
  
        /* We only support ports that have a clock frequency properly
         * encoded in the device-tree.
        /* Add port, irq will be dealt with later. We passed a translated
         * IO port value. It will be fixed up later along with the irq
         */
-       return add_legacy_port(np, -1, UPIO_MEM, addr, addr, NO_IRQ, flags, 0);
+       if (tsi && !strcmp(tsi->type, "tsi-bridge"))
+               return add_legacy_port(np, -1, UPIO_TSI, addr, addr, NO_IRQ, flags, 0);
+       else
+               return add_legacy_port(np, -1, UPIO_MEM, addr, addr, NO_IRQ, flags, 0);
  }
  
  static int __init add_legacy_isa_port(struct device_node *np,
                                      struct device_node *isa_brg)
  {
 -      u32 *reg;
 -      char *typep;
 +      const u32 *reg;
 +      const char *typep;
        int index = -1;
        u64 taddr;
  
        DBG(" -> add_legacy_isa_port(%s)\n", np->full_name);
  
        /* Get the ISA port number */
 -      reg = (u32 *)get_property(np, "reg", NULL);
 +      reg = get_property(np, "reg", NULL);
        if (reg == NULL)
                return -1;
  
        /* Now look for an "ibm,aix-loc" property that gives us ordering
         * if any...
         */
 -      typep = (char *)get_property(np, "ibm,aix-loc", NULL);
 +      typep = get_property(np, "ibm,aix-loc", NULL);
  
        /* If we have a location index, then use it */
        if (typep && *typep == 'S')
@@@ -185,7 -188,7 +189,7 @@@ static int __init add_legacy_pci_port(s
                                      struct device_node *pci_dev)
  {
        u64 addr, base;
 -      u32 *addrp;
 +      const u32 *addrp;
        unsigned int flags;
        int iotype, index = -1, lindex = 0;
  
         * we get to their "reg" property
         */
        if (np != pci_dev) {
 -              u32 *reg = (u32 *)get_property(np, "reg", NULL);
 +              const u32 *reg = get_property(np, "reg", NULL);
                if (reg && (*reg < 4))
                        index = lindex = *reg;
        }
@@@ -282,13 -285,13 +286,13 @@@ static void __init setup_legacy_serial_
  void __init find_legacy_serial_ports(void)
  {
        struct device_node *np, *stdout = NULL;
 -      char *path;
 +      const char *path;
        int index;
  
        DBG(" -> find_legacy_serial_port()\n");
  
        /* Now find out if one of these is out firmware console */
 -      path = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
 +      path = get_property(of_chosen, "linux,stdout-path", NULL);
        if (path != NULL) {
                stdout = of_find_node_by_path(path);
                if (stdout)
@@@ -465,7 -468,7 +469,7 @@@ static int __init serial_dev_init(void
                        fixup_port_irq(i, np, port);
                if (port->iotype == UPIO_PORT)
                        fixup_port_pio(i, np, port);
-               if (port->iotype == UPIO_MEM)
+               if ((port->iotype == UPIO_MEM) || (port->iotype == UPIO_TSI))
                        fixup_port_mmio(i, np, port);
        }
  
@@@ -488,8 -491,8 +492,8 @@@ static int __init check_legacy_serial_c
  {
        struct device_node *prom_stdout = NULL;
        int speed = 0, offset = 0;
 -      char *name;
 -      u32 *spd;
 +      const char *name;
 +      const u32 *spd;
  
        DBG(" -> check_legacy_serial_console()\n");
  
        }
        /* We are getting a weird phandle from OF ... */
        /* ... So use the full path instead */
 -      name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
 +      name = get_property(of_chosen, "linux,stdout-path", NULL);
        if (name == NULL) {
                DBG(" no linux,stdout-path !\n");
                return -ENODEV;
        }
        DBG("stdout is %s\n", prom_stdout->full_name);
  
 -      name = (char *)get_property(prom_stdout, "name", NULL);
 +      name = get_property(prom_stdout, "name", NULL);
        if (!name) {
                DBG(" stdout package has no name !\n");
                goto not_found;
        }
 -      spd = (u32 *)get_property(prom_stdout, "current-speed", NULL);
 +      spd = get_property(prom_stdout, "current-speed", NULL);
        if (spd)
                speed = *spd;
  
@@@ -10,7 -10,6 +10,6 @@@
   */
  
  
- #include <linux/cpumask.h>
  #include <linux/kexec.h>
  #include <linux/smp.h>
  #include <linux/thread_info.h>
@@@ -21,7 -20,6 +20,6 @@@
  #include <asm/machdep.h>
  #include <asm/cacheflush.h>
  #include <asm/paca.h>
- #include <asm/lmb.h>
  #include <asm/mmu.h>
  #include <asm/sections.h>     /* _end */
  #include <asm/prom.h>
@@@ -33,8 -31,8 +31,8 @@@ int default_machine_kexec_prepare(struc
        unsigned long begin, end;       /* limits of segment */
        unsigned long low, high;        /* limits of blocked memory range */
        struct device_node *node;
 -      unsigned long *basep;
 -      unsigned int *sizep;
 +      const unsigned long *basep;
 +      const unsigned int *sizep;
  
        if (!ppc_md.hpte_clear_all)
                return -ENOENT;
        /* We also should not overwrite the tce tables */
        for (node = of_find_node_by_type(NULL, "pci"); node != NULL;
                        node = of_find_node_by_type(node, "pci")) {
 -              basep = (unsigned long *)get_property(node, "linux,tce-base",
 -                                                      NULL);
 -              sizep = (unsigned int *)get_property(node, "linux,tce-size",
 -                                                      NULL);
 +              basep = get_property(node, "linux,tce-base", NULL);
 +              sizep = get_property(node, "linux,tce-size", NULL);
                if (basep == NULL || sizep == NULL)
                        continue;
  
@@@ -383,58 -383,3 +381,3 @@@ static int __init kexec_setup(void
        return 0;
  }
  __initcall(kexec_setup);
- static int __init early_parse_crashk(char *p)
- {
-       unsigned long size;
-       if (!p)
-               return 1;
-       size = memparse(p, &p);
-       if (*p == '@')
-               crashk_res.start = memparse(p + 1, &p);
-       else
-               crashk_res.start = KDUMP_KERNELBASE;
-       crashk_res.end = crashk_res.start + size - 1;
-       return 0;
- }
- early_param("crashkernel", early_parse_crashk);
- void __init reserve_crashkernel(void)
- {
-       unsigned long size;
-       if (crashk_res.start == 0)
-               return;
-       /* We might have got these values via the command line or the
-        * device tree, either way sanitise them now. */
-       size = crashk_res.end - crashk_res.start + 1;
-       if (crashk_res.start != KDUMP_KERNELBASE)
-               printk("Crash kernel location must be 0x%x\n",
-                               KDUMP_KERNELBASE);
-       crashk_res.start = KDUMP_KERNELBASE;
-       size = PAGE_ALIGN(size);
-       crashk_res.end = crashk_res.start + size - 1;
-       /* Crash kernel trumps memory limit */
-       if (memory_limit && memory_limit <= crashk_res.end) {
-               memory_limit = crashk_res.end + 1;
-               printk("Adjusted memory limit for crashkernel, now 0x%lx\n",
-                               memory_limit);
-       }
-       lmb_reserve(crashk_res.start, size);
- }
- int overlaps_crashkernel(unsigned long start, unsigned long size)
- {
-       return (start + size) > crashk_res.start && start <= crashk_res.end;
- }
@@@ -27,7 -27,7 +27,7 @@@
  
  /* Debug utility */
  #ifdef DEBUG
 -static void of_dump_addr(const char *s, u32 *addr, int na)
 +static void of_dump_addr(const char *s, const u32 *addr, int na)
  {
        printk("%s", s);
        while(na--)
@@@ -35,7 -35,7 +35,7 @@@
        printk("\n");
  }
  #else
 -static void of_dump_addr(const char *s, u32 *addr, int na) { }
 +static void of_dump_addr(const char *s, const u32 *addr, int na) { }
  #endif
  
  
@@@ -46,10 -46,9 +46,10 @@@ struct of_bus 
        int             (*match)(struct device_node *parent);
        void            (*count_cells)(struct device_node *child,
                                       int *addrc, int *sizec);
 -      u64             (*map)(u32 *addr, u32 *range, int na, int ns, int pna);
 +      u64             (*map)(u32 *addr, const u32 *range,
 +                              int na, int ns, int pna);
        int             (*translate)(u32 *addr, u64 offset, int na);
 -      unsigned int    (*get_flags)(u32 *addr);
 +      unsigned int    (*get_flags)(const u32 *addr);
  };
  
  
@@@ -66,8 -65,7 +66,8 @@@ static void of_bus_default_count_cells(
                *sizec = prom_n_size_cells(dev);
  }
  
 -static u64 of_bus_default_map(u32 *addr, u32 *range, int na, int ns, int pna)
 +static u64 of_bus_default_map(u32 *addr, const u32 *range,
 +              int na, int ns, int pna)
  {
        u64 cp, s, da;
  
@@@ -95,7 -93,7 +95,7 @@@ static int of_bus_default_translate(u3
        return 0;
  }
  
 -static unsigned int of_bus_default_get_flags(u32 *addr)
 +static unsigned int of_bus_default_get_flags(const u32 *addr)
  {
        return IORESOURCE_MEM;
  }
@@@ -120,7 -118,7 +120,7 @@@ static void of_bus_pci_count_cells(stru
                *sizec = 2;
  }
  
 -static u64 of_bus_pci_map(u32 *addr, u32 *range, int na, int ns, int pna)
 +static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
  {
        u64 cp, s, da;
  
@@@ -145,7 -143,7 +145,7 @@@ static int of_bus_pci_translate(u32 *ad
        return of_bus_default_translate(addr + 1, offset, na - 1);
  }
  
 -static unsigned int of_bus_pci_get_flags(u32 *addr)
 +static unsigned int of_bus_pci_get_flags(const u32 *addr)
  {
        unsigned int flags = 0;
        u32 w = addr[0];
@@@ -180,7 -178,7 +180,7 @@@ static void of_bus_isa_count_cells(stru
                *sizec = 1;
  }
  
 -static u64 of_bus_isa_map(u32 *addr, u32 *range, int na, int ns, int pna)
 +static u64 of_bus_isa_map(u32 *addr, const u32 *range, int na, int ns, int pna)
  {
        u64 cp, s, da;
  
@@@ -205,7 -203,7 +205,7 @@@ static int of_bus_isa_translate(u32 *ad
        return of_bus_default_translate(addr + 1, offset, na - 1);
  }
  
 -static unsigned int of_bus_isa_get_flags(u32 *addr)
 +static unsigned int of_bus_isa_get_flags(const u32 *addr)
  {
        unsigned int flags = 0;
        u32 w = addr[0];
@@@ -270,7 -268,7 +270,7 @@@ static int of_translate_one(struct devi
                            struct of_bus *pbus, u32 *addr,
                            int na, int ns, int pna)
  {
 -      u32 *ranges;
 +      const u32 *ranges;
        unsigned int rlen;
        int rone;
        u64 offset = OF_BAD_ADDR;
         * to translate addresses that aren't supposed to be translated in
         * the first place. --BenH.
         */
 -      ranges = (u32 *)get_property(parent, "ranges", &rlen);
 +      ranges = get_property(parent, "ranges", &rlen);
        if (ranges == NULL || rlen == 0) {
                offset = of_read_number(addr, na);
                memset(addr, 0, pna * 4);
   * that can be mapped to a cpu physical address). This is not really specified
   * that way, but this is traditionally the way IBM at least do things
   */
 -u64 of_translate_address(struct device_node *dev, u32 *in_addr)
 +u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
  {
        struct device_node *parent = NULL;
        struct of_bus *bus, *pbus;
  }
  EXPORT_SYMBOL(of_translate_address);
  
 -u32 *of_get_address(struct device_node *dev, int index, u64 *size,
 +const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
                    unsigned int *flags)
  {
 -      u32 *prop;
 +      const u32 *prop;
        unsigned int psize;
        struct device_node *parent;
        struct of_bus *bus;
                return NULL;
  
        /* Get "reg" or "assigned-addresses" property */
 -      prop = (u32 *)get_property(dev, bus->addresses, &psize);
 +      prop = get_property(dev, bus->addresses, &psize);
        if (prop == NULL)
                return NULL;
        psize /= 4;
  }
  EXPORT_SYMBOL(of_get_address);
  
 -u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
 +const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
                        unsigned int *flags)
  {
 -      u32 *prop;
 +      const u32 *prop;
        unsigned int psize;
        struct device_node *parent;
        struct of_bus *bus;
                return NULL;
  
        /* Get "reg" or "assigned-addresses" property */
 -      prop = (u32 *)get_property(dev, bus->addresses, &psize);
 +      prop = get_property(dev, bus->addresses, &psize);
        if (prop == NULL)
                return NULL;
        psize /= 4;
  }
  EXPORT_SYMBOL(of_get_pci_address);
  
 -static int __of_address_to_resource(struct device_node *dev, u32 *addrp,
 +static int __of_address_to_resource(struct device_node *dev, const u32 *addrp,
                                    u64 size, unsigned int flags,
                                    struct resource *r)
  {
  int of_address_to_resource(struct device_node *dev, int index,
                           struct resource *r)
  {
 -      u32             *addrp;
 +      const u32       *addrp;
        u64             size;
        unsigned int    flags;
  
@@@ -532,7 -530,7 +532,7 @@@ EXPORT_SYMBOL_GPL(of_address_to_resourc
  int of_pci_address_to_resource(struct device_node *dev, int bar,
                               struct resource *r)
  {
 -      u32             *addrp;
 +      const u32       *addrp;
        u64             size;
        unsigned int    flags;
  
  }
  EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
  
 -void of_parse_dma_window(struct device_node *dn, unsigned char *dma_window_prop,
 +void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
                unsigned long *busno, unsigned long *phys, unsigned long *size)
  {
 -      u32 *dma_window, cells;
 -      unsigned char *prop;
 +      const u32 *dma_window;
 +      u32 cells;
 +      const unsigned char *prop;
  
 -      dma_window = (u32 *)dma_window_prop;
 +      dma_window = dma_window_prop;
  
        /* busno is always one cell */
        *busno = *(dma_window++);
@@@ -579,13 -576,13 +579,13 @@@ static struct device_node *of_irq_dflt_
  static struct device_node *of_irq_find_parent(struct device_node *child)
  {
        struct device_node *p;
 -      phandle *parp;
 +      const phandle *parp;
  
        if (!of_node_get(child))
                return NULL;
  
        do {
 -              parp = (phandle *)get_property(child, "interrupt-parent", NULL);
 +              parp = get_property(child, "interrupt-parent", NULL);
                if (parp == NULL)
                        p = of_get_parent(child);
                else {
        return p;
  }
  
- static u8 of_irq_pci_swizzle(u8 slot, u8 pin)
- {
-       return (((pin - 1) + slot) % 4) + 1;
- }
  /* This doesn't need to be called if you don't have any special workaround
   * flags to pass
   */
@@@ -647,11 -639,11 +642,11 @@@ void of_irq_map_init(unsigned int flags
  
  }
  
 -int of_irq_map_raw(struct device_node *parent, u32 *intspec, u32 *addr,
 -                 struct of_irq *out_irq)
 +int of_irq_map_raw(struct device_node *parent, const u32 *intspec,
 +              const u32 *addr, struct of_irq *out_irq)
  {
        struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
 -      u32 *tmp, *imap, *imask;
 +      const u32 *tmp, *imap, *imask;
        u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
        int imaplen, match, i;
  
         * is none, we are nice and just walk up the tree
         */
        do {
 -              tmp = (u32 *)get_property(ipar, "#interrupt-cells", NULL);
 +              tmp = get_property(ipar, "#interrupt-cells", NULL);
                if (tmp != NULL) {
                        intsize = *tmp;
                        break;
         */
        old = of_node_get(ipar);
        do {
 -              tmp = (u32 *)get_property(old, "#address-cells", NULL);
 +              tmp = get_property(old, "#address-cells", NULL);
                tnode = of_get_parent(old);
                of_node_put(old);
                old = tnode;
                }
  
                /* Now look for an interrupt-map */
 -              imap = (u32 *)get_property(ipar, "interrupt-map", &imaplen);
 +              imap = get_property(ipar, "interrupt-map", &imaplen);
                /* No interrupt map, check for an interrupt parent */
                if (imap == NULL) {
                        DBG(" -> no map, getting parent\n");
                imaplen /= sizeof(u32);
  
                /* Look for a mask */
 -              imask = (u32 *)get_property(ipar, "interrupt-map-mask", NULL);
 +              imask = get_property(ipar, "interrupt-map-mask", NULL);
  
                /* If we were passed no "reg" property and we attempt to parse
                 * an interrupt-map, then #address-cells must be 0.
                        /* Get #interrupt-cells and #address-cells of new
                         * parent
                         */
 -                      tmp = (u32 *)get_property(newpar, "#interrupt-cells",
 +                      tmp = get_property(newpar, "#interrupt-cells",
                                                  NULL);
                        if (tmp == NULL) {
                                DBG(" -> parent lacks #interrupt-cells !\n");
                                goto fail;
                        }
                        newintsize = *tmp;
 -                      tmp = (u32 *)get_property(newpar, "#address-cells",
 +                      tmp = get_property(newpar, "#address-cells",
                                                  NULL);
                        newaddrsize = (tmp == NULL) ? 0 : *tmp;
  
@@@ -820,14 -812,14 +815,14 @@@ EXPORT_SYMBOL_GPL(of_irq_map_raw)
  static int of_irq_map_oldworld(struct device_node *device, int index,
                               struct of_irq *out_irq)
  {
 -      u32 *ints;
 +      const u32 *ints;
        int intlen;
  
        /*
         * Old machines just have a list of interrupt numbers
         * and no interrupt-controller nodes.
         */
 -      ints = (u32 *) get_property(device, "AAPL,interrupts", &intlen);
 +      ints = get_property(device, "AAPL,interrupts", &intlen);
        if (ints == NULL)
                return -EINVAL;
        intlen /= sizeof(u32);
@@@ -852,8 -844,7 +847,8 @@@ static int of_irq_map_oldworld(struct d
  int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq)
  {
        struct device_node *p;
 -      u32 *intspec, *tmp, intsize, intlen, *addr;
 +      const u32 *intspec, *tmp, *addr;
 +      u32 intsize, intlen;
        int res;
  
        DBG("of_irq_map_one: dev=%s, index=%d\n", device->full_name, index);
                return of_irq_map_oldworld(device, index, out_irq);
  
        /* Get the interrupts property */
 -      intspec = (u32 *)get_property(device, "interrupts", &intlen);
 +      intspec = get_property(device, "interrupts", &intlen);
        if (intspec == NULL)
                return -EINVAL;
        intlen /= sizeof(u32);
  
        /* Get the reg property (if any) */
 -      addr = (u32 *)get_property(device, "reg", NULL);
 +      addr = get_property(device, "reg", NULL);
  
        /* Look for the interrupt parent. */
        p = of_irq_find_parent(device);
                return -EINVAL;
  
        /* Get size of interrupt specifier */
 -      tmp = (u32 *)get_property(p, "#interrupt-cells", NULL);
 +      tmp = get_property(p, "#interrupt-cells", NULL);
        if (tmp == NULL) {
                of_node_put(p);
                return -EINVAL;
  }
  EXPORT_SYMBOL_GPL(of_irq_map_one);
  
+ #ifdef CONFIG_PCI
+ static u8 of_irq_pci_swizzle(u8 slot, u8 pin)
+ {
+       return (((pin - 1) + slot) % 4) + 1;
+ }
  int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq)
  {
        struct device_node *dn, *ppnode;
        return of_irq_map_raw(ppnode, &lspec, laddr, out_irq);
  }
  EXPORT_SYMBOL_GPL(of_irq_map_pci);
+ #endif /* CONFIG_PCI */
@@@ -417,7 -417,7 +417,7 @@@ static __inline__ void timer_check_rtc(
  /*
   * This version of gettimeofday has microsecond resolution.
   */
- static inline void __do_gettimeofday(struct timeval *tv, u64 tb_val)
+ static inline void __do_gettimeofday(struct timeval *tv)
  {
        unsigned long sec, usec;
        u64 tb_ticks, xsec;
         * without a divide (and in fact, without a multiply)
         */
        temp_varp = do_gtod.varp;
-       tb_ticks = tb_val - temp_varp->tb_orig_stamp;
+       /* Sampling the time base must be done after loading
+        * do_gtod.varp in order to avoid racing with update_gtod.
+        */
+       data_barrier(temp_varp);
+       tb_ticks = get_tb() - temp_varp->tb_orig_stamp;
        temp_tb_to_xs = temp_varp->tb_to_xs;
        temp_stamp_xsec = temp_varp->stamp_xsec;
        xsec = temp_stamp_xsec + mulhdu(tb_ticks, temp_tb_to_xs);
@@@ -464,7 -469,7 +469,7 @@@ void do_gettimeofday(struct timeval *tv
                tv->tv_usec = usec;
                return;
        }
-       __do_gettimeofday(tv, get_tb());
+       __do_gettimeofday(tv);
  }
  
  EXPORT_SYMBOL(do_gettimeofday);
@@@ -650,6 -655,7 +655,7 @@@ void timer_interrupt(struct pt_regs * r
        int next_dec;
        int cpu = smp_processor_id();
        unsigned long ticks;
+       u64 tb_next_jiffy;
  
  #ifdef CONFIG_PPC32
        if (atomic_read(&ppc_n_lost_interrupts) != 0)
                        continue;
  
                write_seqlock(&xtime_lock);
-               tb_last_jiffy += tb_ticks_per_jiffy;
-               tb_last_stamp = per_cpu(last_jiffy, cpu);
-               do_timer(regs);
-               timer_recalc_offset(tb_last_jiffy);
-               timer_check_rtc();
+               tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy;
+               if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) {
+                       tb_last_jiffy = tb_next_jiffy;
+                       tb_last_stamp = per_cpu(last_jiffy, cpu);
+                       do_timer(regs);
+                       timer_recalc_offset(tb_last_jiffy);
+                       timer_check_rtc();
+               }
                write_sequnlock(&xtime_lock);
        }
        
@@@ -859,14 -868,14 +868,14 @@@ EXPORT_SYMBOL(do_settimeofday)
  static int __init get_freq(char *name, int cells, unsigned long *val)
  {
        struct device_node *cpu;
 -      unsigned int *fp;
 +      const unsigned int *fp;
        int found = 0;
  
        /* The cpu node should have timebase and clock frequency properties */
        cpu = of_find_node_by_type(NULL, "cpu");
  
        if (cpu) {
 -              fp = (unsigned int *)get_property(cpu, name, NULL);
 +              fp = get_property(cpu, name, NULL);
                if (fp) {
                        found = 1;
                        *val = 0;
@@@ -37,79 -37,7 +37,7 @@@ unsigned long isa_io_base = 0
  unsigned long isa_mem_base = 0;
  #endif
  
- /*
-  * Internal interrupts are all Level Sensitive, and Positive Polarity
-  *
-  * Note:  Likely, this table and the following function should be
-  *        obtained and derived from the OF Device Tree.
-  */
- static u_char mpc85xx_ads_openpic_initsenses[] __initdata = {
-       MPC85XX_INTERNAL_IRQ_SENSES,
-       0x0,                    /* External  0: */
- #if defined(CONFIG_PCI)
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 1: PCI slot 0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 2: PCI slot 1 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 3: PCI slot 2 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 4: PCI slot 3 */
- #else
-       0x0,                    /* External  1: */
-       0x0,                    /* External  2: */
-       0x0,                    /* External  3: */
-       0x0,                    /* External  4: */
- #endif
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 5: PHY */
-       0x0,                    /* External  6: */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 7: PHY */
-       0x0,                    /* External  8: */
-       0x0,                    /* External  9: */
-       0x0,                    /* External 10: */
-       0x0,                    /* External 11: */
- };
  #ifdef CONFIG_PCI
- /*
-  * interrupt routing
-  */
- int
- mpc85xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
- {
-       static char pci_irq_table[][4] =
-           /*
-            * This is little evil, but works around the fact
-            * that revA boards have IDSEL starting at 18
-            * and others boards (older) start at 12
-            *
-            *      PCI IDSEL/INTPIN->INTLINE
-            *       A      B      C      D
-            */
-       {
-               {PIRQA, PIRQB, PIRQC, PIRQD},   /* IDSEL 2 */
-               {PIRQD, PIRQA, PIRQB, PIRQC},
-               {PIRQC, PIRQD, PIRQA, PIRQB},
-               {PIRQB, PIRQC, PIRQD, PIRQA},   /* IDSEL 5 */
-               {0, 0, 0, 0},   /* -- */
-               {0, 0, 0, 0},   /* -- */
-               {0, 0, 0, 0},   /* -- */
-               {0, 0, 0, 0},   /* -- */
-               {0, 0, 0, 0},   /* -- */
-               {0, 0, 0, 0},   /* -- */
-               {PIRQA, PIRQB, PIRQC, PIRQD},   /* IDSEL 12 */
-               {PIRQD, PIRQA, PIRQB, PIRQC},
-               {PIRQC, PIRQD, PIRQA, PIRQB},
-               {PIRQB, PIRQC, PIRQD, PIRQA},   /* IDSEL 15 */
-               {0, 0, 0, 0},   /* -- */
-               {0, 0, 0, 0},   /* -- */
-               {PIRQA, PIRQB, PIRQC, PIRQD},   /* IDSEL 18 */
-               {PIRQD, PIRQA, PIRQB, PIRQC},
-               {PIRQC, PIRQD, PIRQA, PIRQB},
-               {PIRQB, PIRQC, PIRQD, PIRQA},   /* IDSEL 21 */
-       };
-       const long min_idsel = 2, max_idsel = 21, irqs_per_slot = 4;
-       return PCI_IRQ_TABLE_LOOKUP;
- }
  int
  mpc85xx_exclude_device(u_char bus, u_char devfn)
  {
                return PCIBIOS_SUCCESSFUL;
  }
  
+ void __init
+ mpc85xx_pcibios_fixup(void)
+ {
+       struct pci_dev *dev = NULL;
+       for_each_pci_dev(dev)
+               pci_read_irq_line(dev);
+ }
  #endif /* CONFIG_PCI */
  
  
  void __init mpc85xx_ads_pic_init(void)
  {
-       struct mpic *mpic1;
-       phys_addr_t OpenPIC_PAddr;
-       /* Determine the Physical Address of the OpenPIC regs */
-       OpenPIC_PAddr = get_immrbase() + MPC85xx_OPENPIC_OFFSET;
-       mpic1 = mpic_alloc(OpenPIC_PAddr,
-                          MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
-                          4, MPC85xx_OPENPIC_IRQ_OFFSET, 0, 250,
-                          mpc85xx_ads_openpic_initsenses,
-                          sizeof(mpc85xx_ads_openpic_initsenses),
-                          " OpenPIC  ");
-       BUG_ON(mpic1 == NULL);
-       mpic_assign_isu(mpic1, 0, OpenPIC_PAddr + 0x10200);
-       mpic_assign_isu(mpic1, 1, OpenPIC_PAddr + 0x10280);
-       mpic_assign_isu(mpic1, 2, OpenPIC_PAddr + 0x10300);
-       mpic_assign_isu(mpic1, 3, OpenPIC_PAddr + 0x10380);
-       mpic_assign_isu(mpic1, 4, OpenPIC_PAddr + 0x10400);
-       mpic_assign_isu(mpic1, 5, OpenPIC_PAddr + 0x10480);
-       mpic_assign_isu(mpic1, 6, OpenPIC_PAddr + 0x10500);
-       mpic_assign_isu(mpic1, 7, OpenPIC_PAddr + 0x10580);
-       /* dummy mappings to get to 48 */
-       mpic_assign_isu(mpic1, 8, OpenPIC_PAddr + 0x10600);
-       mpic_assign_isu(mpic1, 9, OpenPIC_PAddr + 0x10680);
-       mpic_assign_isu(mpic1, 10, OpenPIC_PAddr + 0x10700);
-       mpic_assign_isu(mpic1, 11, OpenPIC_PAddr + 0x10780);
-       /* External ints */
-       mpic_assign_isu(mpic1, 12, OpenPIC_PAddr + 0x10000);
-       mpic_assign_isu(mpic1, 13, OpenPIC_PAddr + 0x10080);
-       mpic_assign_isu(mpic1, 14, OpenPIC_PAddr + 0x10100);
-       mpic_init(mpic1);
+       struct mpic *mpic;
+       struct resource r;
+       struct device_node *np = NULL;
+       np = of_find_node_by_type(np, "open-pic");
+       if (np == NULL) {
+               printk(KERN_ERR "Could not find open-pic node\n");
+               return;
+       }
+       if(of_address_to_resource(np, 0, &r)) {
+               printk(KERN_ERR "Could not map mpic register space\n");
+               of_node_put(np);
+               return;
+       }
+       mpic = mpic_alloc(np, r.start,
+                       MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
+                       4, 0, " OpenPIC  ");
+       BUG_ON(mpic == NULL);
+       of_node_put(np);
+       mpic_assign_isu(mpic, 0, r.start + 0x10200);
+       mpic_assign_isu(mpic, 1, r.start + 0x10280);
+       mpic_assign_isu(mpic, 2, r.start + 0x10300);
+       mpic_assign_isu(mpic, 3, r.start + 0x10380);
+       mpic_assign_isu(mpic, 4, r.start + 0x10400);
+       mpic_assign_isu(mpic, 5, r.start + 0x10480);
+       mpic_assign_isu(mpic, 6, r.start + 0x10500);
+       mpic_assign_isu(mpic, 7, r.start + 0x10580);
+       /* Unused on this platform (leave room for 8548) */
+       mpic_assign_isu(mpic, 8, r.start + 0x10600);
+       mpic_assign_isu(mpic, 9, r.start + 0x10680);
+       mpic_assign_isu(mpic, 10, r.start + 0x10700);
+       mpic_assign_isu(mpic, 11, r.start + 0x10780);
+       /* External Interrupts */
+       mpic_assign_isu(mpic, 12, r.start + 0x10000);
+       mpic_assign_isu(mpic, 13, r.start + 0x10080);
+       mpic_assign_isu(mpic, 14, r.start + 0x10100);
+       mpic_init(mpic);
  }
  
  /*
  static void __init mpc85xx_ads_setup_arch(void)
  {
        struct device_node *cpu;
+ #ifdef CONFIG_PCI
        struct device_node *np;
+ #endif
  
        if (ppc_md.progress)
                ppc_md.progress("mpc85xx_ads_setup_arch()", 0);
  
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != 0) {
 -              unsigned int *fp;
 +              const unsigned int *fp;
  
 -              fp = (int *)get_property(cpu, "clock-frequency", NULL);
 +              fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
        for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
                add_bridge(np);
  
-       ppc_md.pci_swizzle = common_swizzle;
-       ppc_md.pci_map_irq = mpc85xx_map_irq;
+       ppc_md.pcibios_fixup = mpc85xx_pcibios_fixup;
        ppc_md.pci_exclude_device = mpc85xx_exclude_device;
  #endif
  
@@@ -57,94 -57,8 +57,8 @@@ unsigned long isa_mem_base = 0
  static int cds_pci_slot = 2;
  static volatile u8 *cadmus;
  
- /*
-  * Internal interrupts are all Level Sensitive, and Positive Polarity
-  *
-  * Note:  Likely, this table and the following function should be
-  *        obtained and derived from the OF Device Tree.
-  */
- static u_char mpc85xx_cds_openpic_initsenses[] __initdata = {
-       MPC85XX_INTERNAL_IRQ_SENSES,
- #if defined(CONFIG_PCI)
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* Ext 0: PCI slot 0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 1: PCI slot 1 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 2: PCI slot 2 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 3: PCI slot 3 */
- #else
-       0x0,                            /* External  0: */
-       0x0,                            /* External  1: */
-       0x0,                            /* External  2: */
-       0x0,                            /* External  3: */
- #endif
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 5: PHY */
-       0x0,                            /* External  6: */
-       0x0,                            /* External  7: */
-       0x0,                            /* External  8: */
-       0x0,                            /* External  9: */
-       0x0,                            /* External 10: */
- #ifdef CONFIG_PCI
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),    /* Ext 11: PCI2 slot 0 */
- #else
-       0x0,                            /* External 11: */
- #endif
- };
  
  #ifdef CONFIG_PCI
- /*
-  * interrupt routing
-  */
- int
- mpc85xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
- {
-       struct pci_controller *hose = pci_bus_to_hose(dev->bus->number);
-       if (!hose->index)
-       {
-               /* Handle PCI1 interrupts */
-               char pci_irq_table[][4] =
-                       /*
-                        *      PCI IDSEL/INTPIN->INTLINE
-                        *        A      B      C      D
-                        */
-                       /* Note IRQ assignment for slots is based on which slot the elysium is
-                        * in -- in this setup elysium is in slot #2 (this PIRQA as first
-                        * interrupt on slot */
-               {
-                       { 0, 1, 2, 3 }, /* 16 - PMC */
-                       { 0, 1, 2, 3 }, /* 17 P2P (Tsi320) */
-                       { 0, 1, 2, 3 }, /* 18 - Slot 1 */
-                       { 1, 2, 3, 0 }, /* 19 - Slot 2 */
-                       { 2, 3, 0, 1 }, /* 20 - Slot 3 */
-                       { 3, 0, 1, 2 }, /* 21 - Slot 4 */
-               };
-               const long min_idsel = 16, max_idsel = 21, irqs_per_slot = 4;
-               int i, j;
-               for (i = 0; i < 6; i++)
-                       for (j = 0; j < 4; j++)
-                               pci_irq_table[i][j] =
-                                       ((pci_irq_table[i][j] + 5 -
-                                         cds_pci_slot) & 0x3) + PIRQ0A;
-               return PCI_IRQ_TABLE_LOOKUP;
-       } else {
-               /* Handle PCI2 interrupts (if we have one) */
-               char pci_irq_table[][4] =
-               {
-                       /*
-                        * We only have one slot and one interrupt
-                        * going to PIRQA - PIRQD */
-                       { PIRQ1A, PIRQ1A, PIRQ1A, PIRQ1A }, /* 21 - slot 0 */
-               };
-               const long min_idsel = 21, max_idsel = 21, irqs_per_slot = 4;
-               return PCI_IRQ_TABLE_LOOKUP;
-       }
- }
  
  #define ARCADIA_HOST_BRIDGE_IDSEL     17
  #define ARCADIA_2ND_BRIDGE_IDSEL      3
@@@ -210,50 -124,104 +124,104 @@@ mpc85xx_cds_pcibios_fixup(void
                pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11);
                pci_dev_put(dev);
        }
+       /* Now map all the PCI irqs */
+       dev = NULL;
+       for_each_pci_dev(dev)
+               pci_read_irq_line(dev);
+ }
+ #ifdef CONFIG_PPC_I8259
+ #warning The i8259 PIC support is currently broken
+ static void mpc85xx_8259_cascade(unsigned int irq, struct
+               irq_desc *desc, struct pt_regs *regs)
+ {
+       unsigned int cascade_irq = i8259_irq(regs);
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq, regs);
+       desc->chip->eoi(irq);
  }
+ #endif /* PPC_I8259 */
  #endif /* CONFIG_PCI */
  
  void __init mpc85xx_cds_pic_init(void)
  {
-       struct mpic *mpic1;
-       phys_addr_t OpenPIC_PAddr;
+       struct mpic *mpic;
+       struct resource r;
+       struct device_node *np = NULL;
+       struct device_node *cascade_node = NULL;
+       int cascade_irq;
  
-       /* Determine the Physical Address of the OpenPIC regs */
-       OpenPIC_PAddr = get_immrbase() + MPC85xx_OPENPIC_OFFSET;
+       np = of_find_node_by_type(np, "open-pic");
+       if (np == NULL) {
+               printk(KERN_ERR "Could not find open-pic node\n");
+               return;
+       }
  
-       mpic1 = mpic_alloc(OpenPIC_PAddr,
+       if (of_address_to_resource(np, 0, &r)) {
+               printk(KERN_ERR "Failed to map mpic register space\n");
+               of_node_put(np);
+               return;
+       }
+       mpic = mpic_alloc(np, r.start,
                        MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
-                       4, MPC85xx_OPENPIC_IRQ_OFFSET, 0, 250,
-                       mpc85xx_cds_openpic_initsenses,
-                       sizeof(mpc85xx_cds_openpic_initsenses), " OpenPIC  ");
-       BUG_ON(mpic1 == NULL);
-       mpic_assign_isu(mpic1, 0, OpenPIC_PAddr + 0x10200);
-       mpic_assign_isu(mpic1, 1, OpenPIC_PAddr + 0x10280);
-       mpic_assign_isu(mpic1, 2, OpenPIC_PAddr + 0x10300);
-       mpic_assign_isu(mpic1, 3, OpenPIC_PAddr + 0x10380);
-       mpic_assign_isu(mpic1, 4, OpenPIC_PAddr + 0x10400);
-       mpic_assign_isu(mpic1, 5, OpenPIC_PAddr + 0x10480);
-       mpic_assign_isu(mpic1, 6, OpenPIC_PAddr + 0x10500);
-       mpic_assign_isu(mpic1, 7, OpenPIC_PAddr + 0x10580);
-       /* dummy mappings to get to 48 */
-       mpic_assign_isu(mpic1, 8, OpenPIC_PAddr + 0x10600);
-       mpic_assign_isu(mpic1, 9, OpenPIC_PAddr + 0x10680);
-       mpic_assign_isu(mpic1, 10, OpenPIC_PAddr + 0x10700);
-       mpic_assign_isu(mpic1, 11, OpenPIC_PAddr + 0x10780);
-       /* External ints */
-       mpic_assign_isu(mpic1, 12, OpenPIC_PAddr + 0x10000);
-       mpic_assign_isu(mpic1, 13, OpenPIC_PAddr + 0x10080);
-       mpic_assign_isu(mpic1, 14, OpenPIC_PAddr + 0x10100);
-       mpic_init(mpic1);
+                       4, 0, " OpenPIC  ");
+       BUG_ON(mpic == NULL);
+       /* Return the mpic node */
+       of_node_put(np);
+       mpic_assign_isu(mpic, 0, r.start + 0x10200);
+       mpic_assign_isu(mpic, 1, r.start + 0x10280);
+       mpic_assign_isu(mpic, 2, r.start + 0x10300);
+       mpic_assign_isu(mpic, 3, r.start + 0x10380);
+       mpic_assign_isu(mpic, 4, r.start + 0x10400);
+       mpic_assign_isu(mpic, 5, r.start + 0x10480);
+       mpic_assign_isu(mpic, 6, r.start + 0x10500);
+       mpic_assign_isu(mpic, 7, r.start + 0x10580);
+       /* Used only for 8548 so far, but no harm in
+        * allocating them for everyone */
+       mpic_assign_isu(mpic, 8, r.start + 0x10600);
+       mpic_assign_isu(mpic, 9, r.start + 0x10680);
+       mpic_assign_isu(mpic, 10, r.start + 0x10700);
+       mpic_assign_isu(mpic, 11, r.start + 0x10780);
+       /* External Interrupts */
+       mpic_assign_isu(mpic, 12, r.start + 0x10000);
+       mpic_assign_isu(mpic, 13, r.start + 0x10080);
+       mpic_assign_isu(mpic, 14, r.start + 0x10100);
+       mpic_init(mpic);
+ #ifdef CONFIG_PPC_I8259
+       /* Initialize the i8259 controller */
+       for_each_node_by_type(np, "interrupt-controller")
+               if (device_is_compatible(np, "chrp,iic")) {
+                       cascade_node = np;
+                       break;
+               }
+       if (cascade_node == NULL) {
+               printk(KERN_DEBUG "Could not find i8259 PIC\n");
+               return;
+       }
  
- #ifdef CONFIG_PCI
-       mpic_setup_cascade(PIRQ0A, i8259_irq_cascade, NULL);
+       cascade_irq = irq_of_parse_and_map(cascade_node, 0);
+       if (cascade_irq == NO_IRQ) {
+               printk(KERN_ERR "Failed to map cascade interrupt\n");
+               return;
+       }
  
-       i8259_init(0,0);
- #endif
+       i8259_init(cascade_node, 0);
+       of_node_put(cascade_node);
+       set_irq_chained_handler(cascade_irq, mpc85xx_8259_cascade);
+ #endif /* CONFIG_PPC_I8259 */
  }
  
  
@@@ -273,9 -241,9 +241,9 @@@ mpc85xx_cds_setup_arch(void
  
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != 0) {
 -              unsigned int *fp;
 +              const unsigned int *fp;
  
 -              fp = (int *)get_property(cpu, "clock-frequency", NULL);
 +              fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
                add_bridge(np);
  
        ppc_md.pcibios_fixup = mpc85xx_cds_pcibios_fixup;
-       ppc_md.pci_swizzle = common_swizzle;
-       ppc_md.pci_map_irq = mpc85xx_map_irq;
        ppc_md.pci_exclude_device = mpc85xx_exclude_device;
  #endif
  
@@@ -68,37 -68,36 +68,36 @@@ mpc86xx_hpcn_init_irq(void
  {
        struct mpic *mpic1;
        struct device_node *np;
-       phys_addr_t openpic_paddr;
+       struct resource res;
  #ifdef CONFIG_PCI
        struct device_node *cascade_node = NULL;
        int cascade_irq;
  #endif
  
+       /* Determine PIC address. */
        np = of_find_node_by_type(NULL, "open-pic");
        if (np == NULL)
                return;
-       /* Determine the Physical Address of the OpenPIC regs */
-       openpic_paddr = get_immrbase() + MPC86xx_OPENPIC_OFFSET;
+       of_address_to_resource(np, 0, &res);
  
        /* Alloc mpic structure and per isu has 16 INT entries. */
-       mpic1 = mpic_alloc(np, openpic_paddr,
+       mpic1 = mpic_alloc(np, res.start,
                        MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
                        16, NR_IRQS - 4,
                        " MPIC     ");
        BUG_ON(mpic1 == NULL);
  
-       mpic_assign_isu(mpic1, 0, openpic_paddr + 0x10000);
+       mpic_assign_isu(mpic1, 0, res.start + 0x10000);
  
        /* 48 Internal Interrupts */
-       mpic_assign_isu(mpic1, 1, openpic_paddr + 0x10200);
-       mpic_assign_isu(mpic1, 2, openpic_paddr + 0x10400);
-       mpic_assign_isu(mpic1, 3, openpic_paddr + 0x10600);
+       mpic_assign_isu(mpic1, 1, res.start + 0x10200);
+       mpic_assign_isu(mpic1, 2, res.start + 0x10400);
+       mpic_assign_isu(mpic1, 3, res.start + 0x10600);
  
        /* 16 External interrupts
         * Moving them from [0 - 15] to [64 - 79]
         */
-       mpic_assign_isu(mpic1, 4, openpic_paddr + 0x10000);
+       mpic_assign_isu(mpic1, 4, res.start + 0x10000);
  
        mpic_init(mpic1);
  
@@@ -348,9 -347,9 +347,9 @@@ mpc86xx_hpcn_setup_arch(void
  
        np = of_find_node_by_type(NULL, "cpu");
        if (np != 0) {
 -              unsigned int *fp;
 +              const unsigned int *fp;
  
 -              fp = (int *)get_property(np, "clock-frequency", NULL);
 +              fp = get_property(np, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
@@@ -1,7 -1,7 +1,7 @@@
  /*
   * mpc7448_hpc2.c
   *
-  * Board setup routines for the Freescale Taiga platform
+  * Board setup routines for the Freescale mpc7448hpc2(taiga) platform
   *
   * Author: Jacob Pan
   *     jacob.pan@freescale.com
   *
   * Copyright 2004-2006 Freescale Semiconductor, Inc.
   *
-  * This file is licensed under
-  * the terms of the GNU General Public License version 2.  This program
-  * is licensed "as is" without any warranty of any kind, whether express
-  * or implied.
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License
+  * as published by the Free Software Foundation; either version
+  * 2 of the License, or (at your option) any later version.
   */
  
  #include <linux/config.h>
@@@ -62,43 -62,8 +62,8 @@@ pci_dram_offset = MPC7448_HPC2_PCI_MEM_
  extern int tsi108_setup_pci(struct device_node *dev);
  extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
  extern void tsi108_pci_int_init(void);
- extern int tsi108_irq_cascade(struct pt_regs *regs, void *unused);
- /*
-  * Define all of the IRQ senses and polarities.  Taken from the
-  * mpc7448hpc  manual.
-  * Note:  Likely, this table and the following function should be
-  *        obtained and derived from the OF Device Tree.
-  */
- static u_char mpc7448_hpc2_pic_initsenses[] __initdata = {
-       /* External on-board sources */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* INT[0] XINT0 from FPGA */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* INT[1] XINT1 from FPGA */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* INT[2] PHY_INT from both GIGE */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* INT[3] RESERVED */
-       /* Internal Tsi108/109 interrupt sources */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Reserved IRQ */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Reserved IRQ */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Reserved IRQ */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Reserved IRQ */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* DMA0 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* DMA1 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* DMA2 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* DMA3 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* UART0 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* UART1 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* I2C */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* GPIO */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* GIGE0 */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* GIGE1 */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Reserved IRQ */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* HLP */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* SDC */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Processor IF */
-       (IRQ_SENSE_EDGE  | IRQ_POLARITY_POSITIVE),      /* Reserved IRQ */
-       (IRQ_SENSE_LEVEL | IRQ_POLARITY_POSITIVE),      /* PCI/X block */
- };
+ extern void tsi108_irq_cascade(unsigned int irq, struct irq_desc *desc,
+                           struct pt_regs *regs);
  
  int mpc7448_hpc2_exclude_device(u_char bus, u_char devfn)
  {
@@@ -130,7 -95,7 +95,7 @@@ void mpc7448_hpc2_fixup_irq(struct pci_
  {
        struct pci_controller *hose;
        struct device_node *node;
 -      unsigned int *interrupt;
 +      const unsigned int *interrupt;
        int busnr;
        int len;
        u8 slot;
        if (!node)
                printk(KERN_ERR "No pci node found\n");
  
 -      interrupt = (unsigned int *) get_property(node, "interrupt-map", &len);
 +      interrupt = get_property(node, "interrupt-map", &len);
        slot = find_slot_by_devfn(interrupt, dev->devfn);
        pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
        if (pin == 0 || pin > 4)
@@@ -176,9 -141,9 +141,9 @@@ static void __init mpc7448_hpc2_setup_a
  
        cpu = of_find_node_by_type(NULL, "cpu");
        if (cpu != 0) {
 -              unsigned int *fp;
 +              const unsigned int *fp;
  
 -              fp = (int *)get_property(cpu, "clock-frequency", NULL);
 +              fp = get_property(cpu, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
@@@ -229,6 -194,8 +194,8 @@@ static void __init mpc7448_hpc2_init_IR
  {
        struct mpic *mpic;
        phys_addr_t mpic_paddr = 0;
+       unsigned int cascade_pci_irq;
+       struct device_node *tsi_pci;
        struct device_node *tsi_pic;
  
        tsi_pic = of_find_node_by_type(NULL, "open-pic");
        DBG("%s: tsi108pic phys_addr = 0x%x\n", __FUNCTION__,
            (u32) mpic_paddr);
  
-       mpic = mpic_alloc(mpic_paddr,
+       mpic = mpic_alloc(tsi_pic, mpic_paddr,
                        MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET |
                        MPIC_SPV_EOI | MPIC_MOD_ID(MPIC_ID_TSI108),
                        0, /* num_sources used */
-                       TSI108_IRQ_BASE,
                        0, /* num_sources used */
-                       NR_IRQS - 4 /* XXXX */,
-                       mpc7448_hpc2_pic_initsenses,
-                       sizeof(mpc7448_hpc2_pic_initsenses), "Tsi108_PIC");
+                       "Tsi108_PIC");
  
        BUG_ON(mpic == NULL); /* XXXX */
        mpic_init(mpic);
-       mpic_setup_cascade(IRQ_TSI108_PCI, tsi108_irq_cascade, mpic);
+       tsi_pci = of_find_node_by_type(NULL, "pci");
+       if (tsi_pci == 0) {
+               printk("%s: No tsi108 pci node found !\n", __FUNCTION__);
+               return;
+       }
+       cascade_pci_irq = irq_of_parse_and_map(tsi_pci, 0);
+       set_irq_data(cascade_pci_irq, mpic);
+       set_irq_chained_handler(cascade_pci_irq, tsi108_irq_cascade);
        tsi108_pci_int_init();
  
        /* Configure MPIC outputs to CPU0 */
        tsi108_write_reg(TSI108_MPIC_OFFSET + 0x30c, 0);
+       of_node_put(tsi_pic);
  }
  
  void mpc7448_hpc2_show_cpuinfo(struct seq_file *m)
@@@ -320,6 -294,7 +294,7 @@@ static int mpc7448_machine_check_except
        return 0;
  
  }
  define_machine(mpc7448_hpc2){
        .name                   = "MPC7448 HPC2",
        .probe                  = mpc7448_hpc2_probe,
@@@ -41,7 -41,7 +41,7 @@@ phys_addr_t get_immrbase(void
        soc = of_find_node_by_type(NULL, "soc");
        if (soc) {
                unsigned int size;
 -              void *prop = get_property(soc, "reg", &size);
 +              const void *prop = get_property(soc, "reg", &size);
                immrbase = of_translate_address(soc, prop);
                of_node_put(soc);
        };
@@@ -85,7 -85,7 +85,7 @@@ static int __init gfar_mdio_of_init(voi
                        mdio_data.irq[k] = -1;
  
                while ((child = of_get_next_child(np, child)) != NULL) {
 -                      u32 *id = get_property(child, "reg", NULL);
 +                      const u32 *id = get_property(child, "reg", NULL);
                        mdio_data.irq[*id] = irq_of_parse_and_map(child, 0);
                }
  
@@@ -124,10 -124,10 +124,10 @@@ static int __init gfar_of_init(void
                struct resource r[4];
                struct device_node *phy, *mdio;
                struct gianfar_platform_data gfar_data;
 -              unsigned int *id;
 -              char *model;
 -              void *mac_addr;
 -              phandle *ph;
 +              const unsigned int *id;
 +              const char *model;
 +              const void *mac_addr;
 +              const phandle *ph;
                int n_res = 1;
  
                memset(r, 0, sizeof(r));
                        goto err;
                }
  
-               mac_addr = get_property(np, "address", NULL);
-               memcpy(gfar_data.mac_addr, mac_addr, 6);
+               mac_addr = get_property(np, "local-mac-address", NULL);
+               if (mac_addr == NULL)
+                       mac_addr = get_property(np, "mac-address", NULL);
+               if (mac_addr == NULL) {
+                       /* Obsolete */
+                       mac_addr = get_property(np, "address", NULL);
+               }
+               if (mac_addr)
+                       memcpy(gfar_data.mac_addr, mac_addr, 6);
  
                if (model && !strcasecmp(model, "TSEC"))
                        gfar_data.device_flags =
                            FSL_GIANFAR_DEV_HAS_VLAN |
                            FSL_GIANFAR_DEV_HAS_EXTENDED_HASH;
  
 -              ph = (phandle *) get_property(np, "phy-handle", NULL);
 +              ph = get_property(np, "phy-handle", NULL);
                phy = of_find_node_by_phandle(*ph);
  
                if (phy == NULL) {
  
                mdio = of_get_parent(phy);
  
 -              id = (u32 *) get_property(phy, "reg", NULL);
 +              id = get_property(phy, "reg", NULL);
                ret = of_address_to_resource(mdio, 0, &res);
                if (ret) {
                        of_node_put(phy);
@@@ -239,7 -247,7 +247,7 @@@ static int __init fsl_i2c_of_init(void
             i++) {
                struct resource r[2];
                struct fsl_i2c_platform_data i2c_data;
 -              unsigned char *flags = NULL;
 +              const unsigned char *flags = NULL;
  
                memset(&r, 0, sizeof(r));
                memset(&i2c_data, 0, sizeof(i2c_data));
@@@ -290,7 -298,7 +298,7 @@@ static int __init mpc83xx_wdt_init(void
        struct resource r;
        struct device_node *soc, *np;
        struct platform_device *dev;
 -      unsigned int *freq;
 +      const unsigned int *freq;
        int ret;
  
        np = of_find_compatible_node(NULL, "watchdog", "mpc83xx_wdt");
                goto nosoc;
        }
  
 -      freq = (unsigned int *)get_property(soc, "bus-frequency", NULL);
 +      freq = get_property(soc, "bus-frequency", NULL);
        if (!freq) {
                ret = -ENODEV;
                goto err;
@@@ -347,7 -355,7 +355,7 @@@ nodev
  arch_initcall(mpc83xx_wdt_init);
  #endif
  
 -static enum fsl_usb2_phy_modes determine_usb_phy(char * phy_type)
 +static enum fsl_usb2_phy_modes determine_usb_phy(const char *phy_type)
  {
        if (!phy_type)
                return FSL_USB2_PHY_NONE;
@@@ -375,7 -383,7 +383,7 @@@ static int __init fsl_usb_of_init(void
             i++) {
                struct resource r[2];
                struct fsl_usb2_platform_data usb_data;
 -              unsigned char *prop = NULL;
 +              const unsigned char *prop = NULL;
  
                memset(&r, 0, sizeof(r));
                memset(&usb_data, 0, sizeof(usb_data));
             i++) {
                struct resource r[2];
                struct fsl_usb2_platform_data usb_data;
 -              unsigned char *prop = NULL;
 +              const unsigned char *prop = NULL;
  
                memset(&r, 0, sizeof(r));
                memset(&usb_data, 0, sizeof(usb_data));
@@@ -26,7 -26,6 +26,6 @@@
  #include <linux/irq.h>
  #include <linux/interrupt.h>
  
  #include <asm/byteorder.h>
  #include <asm/io.h>
  #include <asm/irq.h>
@@@ -195,7 -194,7 +194,7 @@@ int __init tsi108_setup_pci(struct devi
        int len;
        struct pci_controller *hose;
        struct resource rsrc;
 -      int *bus_range;
 +      const int *bus_range;
        int primary = 0, has_address = 0;
  
        /* PCI Config mapping */
        has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
  
        /* Get bus range if any */
 -      bus_range = (int *)get_property(dev, "bus-range", &len);
 +      bus_range = get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                       " bus 0\n", dev->full_name);
  
        (hose)->ops = &tsi108_direct_pci_ops;
  
-       printk(KERN_INFO "Found tsi108 PCI host bridge at 0x%08lx. "
+       printk(KERN_INFO "Found tsi108 PCI host bridge at 0x%08x. "
               "Firmware bus number: %d->%d\n",
               rsrc.start, hose->first_busno, hose->last_busno);
  
@@@ -278,7 -277,7 +277,7 @@@ static void init_pci_source(void
        mb();
  }
  
- static inline int get_pci_source(void)
+ static inline unsigned int get_pci_source(void)
  {
        u_int temp = 0;
        int irq = -1;
@@@ -371,12 -370,12 +370,12 @@@ static void tsi108_pci_irq_end(u_int ir
   * Interrupt controller descriptor for cascaded PCI interrupt controller.
   */
  
- struct hw_interrupt_type tsi108_pci_irq = {
+ static struct irq_chip tsi108_pci_irq = {
        .typename = "tsi108_PCI_int",
-       .enable = tsi108_pci_irq_enable,
-       .disable = tsi108_pci_irq_disable,
+       .mask = tsi108_pci_irq_disable,
        .ack = tsi108_pci_irq_ack,
        .end = tsi108_pci_irq_end,
+       .unmask = tsi108_pci_irq_enable,
  };
  
  /*
@@@ -399,14 -398,18 +398,18 @@@ void __init tsi108_pci_int_init(void
        DBG("Tsi108_pci_int_init: initializing PCI interrupts\n");
  
        for (i = 0; i < NUM_PCI_IRQS; i++) {
-               irq_desc[i + IRQ_PCI_INTAD_BASE].handler = &tsi108_pci_irq;
+               irq_desc[i + IRQ_PCI_INTAD_BASE].chip = &tsi108_pci_irq;
                irq_desc[i + IRQ_PCI_INTAD_BASE].status |= IRQ_LEVEL;
        }
  
        init_pci_source();
  }
  
- int tsi108_irq_cascade(struct pt_regs *regs, void *unused)
+ void tsi108_irq_cascade(unsigned int irq, struct irq_desc *desc,
+                           struct pt_regs *regs)
  {
-       return get_pci_source();
+       unsigned int cascade_irq = get_pci_source();
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq, regs);
+       desc->chip->eoi(irq);
  }
  #define smp_read_barrier_depends()    do { } while(0)
  #endif /* CONFIG_SMP */
  
+ /*
+  * This is a barrier which prevents following instructions from being
+  * started until the value of the argument x is known.  For example, if
+  * x is a variable loaded from memory, this prevents following
+  * instructions from being executed until the load has been performed.
+  */
+ #define data_barrier(x)       \
+       asm volatile("twi 0,%0,0; isync" : : "r" (x) : "memory");
  struct task_struct;
  struct pt_regs;
  
@@@ -168,6 -177,11 +177,6 @@@ extern u32 booke_wdt_enabled
  extern u32 booke_wdt_period;
  #endif /* CONFIG_BOOKE_WDT */
  
 -/* EBCDIC -> ASCII conversion for [0-9A-Z] on iSeries */
 -extern unsigned char e2a(unsigned char);
 -extern unsigned char* strne2a(unsigned char *dest,
 -              const unsigned char *src, size_t n);
 -
  struct device_node;
  extern void note_scsi_host(struct device_node *, void *);